From e0824c2d9344141e0db8f83a7a75a52bd0b50d59 Mon Sep 17 00:00:00 2001 From: Asuka Minato Date: Mon, 24 Nov 2025 11:04:11 +0900 Subject: [PATCH] api -> console_ns (#28246) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- api/controllers/console/admin.py | 24 +- api/controllers/console/apikey.py | 62 ++-- .../console/app/advanced_prompt_template.py | 12 +- api/controllers/console/app/agent.py | 16 +- api/controllers/console/app/annotation.py | 138 ++++----- api/controllers/console/app/app.py | 164 +++++------ api/controllers/console/app/app_import.py | 3 +- api/controllers/console/app/audio.py | 46 +-- api/controllers/console/app/completion.py | 50 ++-- api/controllers/console/app/conversation.py | 78 ++--- .../console/app/conversation_variables.py | 14 +- api/controllers/console/app/generator.py | 70 ++--- api/controllers/console/app/mcp_server.py | 52 ++-- api/controllers/console/app/message.py | 66 +++-- api/controllers/console/app/model_config.py | 18 +- api/controllers/console/app/ops_trace.py | 58 ++-- api/controllers/console/app/site.py | 30 +- api/controllers/console/app/statistic.py | 84 +++--- api/controllers/console/app/workflow.py | 278 +++++++++--------- .../console/app/workflow_app_log.py | 12 +- .../console/app/workflow_draft_variable.py | 106 +++---- api/controllers/console/app/workflow_run.py | 94 +++--- .../console/app/workflow_statistic.py | 50 ++-- .../console/app/workflow_trigger.py | 8 +- api/controllers/console/auth/activate.py | 24 +- .../console/auth/data_source_oauth.py | 50 ++-- .../console/auth/forgot_password.py | 44 +-- api/controllers/console/auth/oauth.py | 24 +- api/controllers/console/billing/billing.py | 16 +- api/controllers/console/datasets/datasets.py | 156 +++++----- .../console/datasets/datasets_document.py | 90 +++--- api/controllers/console/datasets/external.py | 68 ++--- .../console/datasets/hit_testing.py | 18 +- .../datasets/rag_pipeline/datasource_auth.py | 14 +- .../datasource_content_preview.py | 6 +- .../rag_pipeline/rag_pipeline_workflow.py | 34 +-- api/controllers/console/datasets/website.py | 26 +- api/controllers/console/datasets/wraps.py | 48 ++- .../console/explore/recommended_app.py | 4 +- api/controllers/console/extension.py | 64 ++-- api/controllers/console/feature.py | 20 +- api/controllers/console/init_validate.py | 24 +- api/controllers/console/ping.py | 10 +- api/controllers/console/remote_files.py | 3 +- api/controllers/console/setup.py | 24 +- api/controllers/console/tag/tags.py | 10 +- api/controllers/console/version.py | 12 +- api/controllers/console/workspace/account.py | 32 +- .../console/workspace/agent_providers.py | 16 +- api/controllers/console/workspace/endpoint.py | 104 ++++--- api/controllers/console/workspace/members.py | 12 +- .../console/workspace/model_providers.py | 18 +- api/controllers/console/workspace/models.py | 28 +- api/controllers/console/workspace/plugin.py | 38 +-- .../console/workspace/tool_providers.py | 50 ++-- .../console/workspace/trigger_providers.py | 34 ++- .../console/workspace/workspace.py | 6 +- 57 files changed, 1354 insertions(+), 1306 deletions(-) diff --git a/api/controllers/console/admin.py b/api/controllers/console/admin.py index 2c4d8709eb..da9282cd0c 100644 --- a/api/controllers/console/admin.py +++ b/api/controllers/console/admin.py @@ -12,7 +12,7 @@ P = ParamSpec("P") R = TypeVar("R") from configs import dify_config from constants.languages import supported_language -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.wraps import only_edition_cloud from extensions.ext_database import db from libs.token import extract_access_token @@ -38,10 +38,10 @@ def admin_required(view: Callable[P, R]): @console_ns.route("/admin/insert-explore-apps") class InsertExploreAppListApi(Resource): - @api.doc("insert_explore_app") - @api.doc(description="Insert or update an app in the explore list") - @api.expect( - api.model( + @console_ns.doc("insert_explore_app") + @console_ns.doc(description="Insert or update an app in the explore list") + @console_ns.expect( + console_ns.model( "InsertExploreAppRequest", { "app_id": fields.String(required=True, description="Application ID"), @@ -55,9 +55,9 @@ class InsertExploreAppListApi(Resource): }, ) ) - @api.response(200, "App updated successfully") - @api.response(201, "App inserted successfully") - @api.response(404, "App not found") + @console_ns.response(200, "App updated successfully") + @console_ns.response(201, "App inserted successfully") + @console_ns.response(404, "App not found") @only_edition_cloud @admin_required def post(self): @@ -131,10 +131,10 @@ class InsertExploreAppListApi(Resource): @console_ns.route("/admin/insert-explore-apps/") class InsertExploreAppApi(Resource): - @api.doc("delete_explore_app") - @api.doc(description="Remove an app from the explore list") - @api.doc(params={"app_id": "Application ID to remove"}) - @api.response(204, "App removed successfully") + @console_ns.doc("delete_explore_app") + @console_ns.doc(description="Remove an app from the explore list") + @console_ns.doc(params={"app_id": "Application ID to remove"}) + @console_ns.response(204, "App removed successfully") @only_edition_cloud @admin_required def delete(self, app_id): diff --git a/api/controllers/console/apikey.py b/api/controllers/console/apikey.py index bd5862cbd0..d93858d3fc 100644 --- a/api/controllers/console/apikey.py +++ b/api/controllers/console/apikey.py @@ -11,7 +11,7 @@ from libs.login import current_account_with_tenant, login_required from models.dataset import Dataset from models.model import ApiToken, App -from . import api, console_ns +from . import console_ns from .wraps import account_initialization_required, edit_permission_required, setup_required api_key_fields = { @@ -133,20 +133,20 @@ class BaseApiKeyResource(Resource): @console_ns.route("/apps//api-keys") class AppApiKeyListResource(BaseApiKeyListResource): - @api.doc("get_app_api_keys") - @api.doc(description="Get all API keys for an app") - @api.doc(params={"resource_id": "App ID"}) - @api.response(200, "Success", api_key_list) - def get(self, resource_id): + @console_ns.doc("get_app_api_keys") + @console_ns.doc(description="Get all API keys for an app") + @console_ns.doc(params={"resource_id": "App ID"}) + @console_ns.response(200, "Success", api_key_list) + def get(self, resource_id): # type: ignore """Get all API keys for an app""" return super().get(resource_id) - @api.doc("create_app_api_key") - @api.doc(description="Create a new API key for an app") - @api.doc(params={"resource_id": "App ID"}) - @api.response(201, "API key created successfully", api_key_fields) - @api.response(400, "Maximum keys exceeded") - def post(self, resource_id): + @console_ns.doc("create_app_api_key") + @console_ns.doc(description="Create a new API key for an app") + @console_ns.doc(params={"resource_id": "App ID"}) + @console_ns.response(201, "API key created successfully", api_key_fields) + @console_ns.response(400, "Maximum keys exceeded") + def post(self, resource_id): # type: ignore """Create a new API key for an app""" return super().post(resource_id) @@ -158,10 +158,10 @@ class AppApiKeyListResource(BaseApiKeyListResource): @console_ns.route("/apps//api-keys/") class AppApiKeyResource(BaseApiKeyResource): - @api.doc("delete_app_api_key") - @api.doc(description="Delete an API key for an app") - @api.doc(params={"resource_id": "App ID", "api_key_id": "API key ID"}) - @api.response(204, "API key deleted successfully") + @console_ns.doc("delete_app_api_key") + @console_ns.doc(description="Delete an API key for an app") + @console_ns.doc(params={"resource_id": "App ID", "api_key_id": "API key ID"}) + @console_ns.response(204, "API key deleted successfully") def delete(self, resource_id, api_key_id): """Delete an API key for an app""" return super().delete(resource_id, api_key_id) @@ -173,20 +173,20 @@ class AppApiKeyResource(BaseApiKeyResource): @console_ns.route("/datasets//api-keys") class DatasetApiKeyListResource(BaseApiKeyListResource): - @api.doc("get_dataset_api_keys") - @api.doc(description="Get all API keys for a dataset") - @api.doc(params={"resource_id": "Dataset ID"}) - @api.response(200, "Success", api_key_list) - def get(self, resource_id): + @console_ns.doc("get_dataset_api_keys") + @console_ns.doc(description="Get all API keys for a dataset") + @console_ns.doc(params={"resource_id": "Dataset ID"}) + @console_ns.response(200, "Success", api_key_list) + def get(self, resource_id): # type: ignore """Get all API keys for a dataset""" return super().get(resource_id) - @api.doc("create_dataset_api_key") - @api.doc(description="Create a new API key for a dataset") - @api.doc(params={"resource_id": "Dataset ID"}) - @api.response(201, "API key created successfully", api_key_fields) - @api.response(400, "Maximum keys exceeded") - def post(self, resource_id): + @console_ns.doc("create_dataset_api_key") + @console_ns.doc(description="Create a new API key for a dataset") + @console_ns.doc(params={"resource_id": "Dataset ID"}) + @console_ns.response(201, "API key created successfully", api_key_fields) + @console_ns.response(400, "Maximum keys exceeded") + def post(self, resource_id): # type: ignore """Create a new API key for a dataset""" return super().post(resource_id) @@ -198,10 +198,10 @@ class DatasetApiKeyListResource(BaseApiKeyListResource): @console_ns.route("/datasets//api-keys/") class DatasetApiKeyResource(BaseApiKeyResource): - @api.doc("delete_dataset_api_key") - @api.doc(description="Delete an API key for a dataset") - @api.doc(params={"resource_id": "Dataset ID", "api_key_id": "API key ID"}) - @api.response(204, "API key deleted successfully") + @console_ns.doc("delete_dataset_api_key") + @console_ns.doc(description="Delete an API key for a dataset") + @console_ns.doc(params={"resource_id": "Dataset ID", "api_key_id": "API key ID"}) + @console_ns.response(204, "API key deleted successfully") def delete(self, resource_id, api_key_id): """Delete an API key for a dataset""" return super().delete(resource_id, api_key_id) diff --git a/api/controllers/console/app/advanced_prompt_template.py b/api/controllers/console/app/advanced_prompt_template.py index 075345d860..0ca163d2a5 100644 --- a/api/controllers/console/app/advanced_prompt_template.py +++ b/api/controllers/console/app/advanced_prompt_template.py @@ -1,6 +1,6 @@ from flask_restx import Resource, fields, reqparse -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.wraps import account_initialization_required, setup_required from libs.login import login_required from services.advanced_prompt_template_service import AdvancedPromptTemplateService @@ -16,13 +16,13 @@ parser = ( @console_ns.route("/app/prompt-templates") class AdvancedPromptTemplateList(Resource): - @api.doc("get_advanced_prompt_templates") - @api.doc(description="Get advanced prompt templates based on app mode and model configuration") - @api.expect(parser) - @api.response( + @console_ns.doc("get_advanced_prompt_templates") + @console_ns.doc(description="Get advanced prompt templates based on app mode and model configuration") + @console_ns.expect(parser) + @console_ns.response( 200, "Prompt templates retrieved successfully", fields.List(fields.Raw(description="Prompt template data")) ) - @api.response(400, "Invalid request parameters") + @console_ns.response(400, "Invalid request parameters") @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/app/agent.py b/api/controllers/console/app/agent.py index fde28fdb98..7e31d0a844 100644 --- a/api/controllers/console/app/agent.py +++ b/api/controllers/console/app/agent.py @@ -1,6 +1,6 @@ from flask_restx import Resource, fields, reqparse -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.app.wraps import get_app_model from controllers.console.wraps import account_initialization_required, setup_required from libs.helper import uuid_value @@ -17,12 +17,14 @@ parser = ( @console_ns.route("/apps//agent/logs") class AgentLogApi(Resource): - @api.doc("get_agent_logs") - @api.doc(description="Get agent execution logs for an application") - @api.doc(params={"app_id": "Application ID"}) - @api.expect(parser) - @api.response(200, "Agent logs retrieved successfully", fields.List(fields.Raw(description="Agent log entries"))) - @api.response(400, "Invalid request parameters") + @console_ns.doc("get_agent_logs") + @console_ns.doc(description="Get agent execution logs for an application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect(parser) + @console_ns.response( + 200, "Agent logs retrieved successfully", fields.List(fields.Raw(description="Agent log entries")) + ) + @console_ns.response(400, "Invalid request parameters") @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/app/annotation.py b/api/controllers/console/app/annotation.py index bc4113b5c7..0be39c9178 100644 --- a/api/controllers/console/app/annotation.py +++ b/api/controllers/console/app/annotation.py @@ -4,7 +4,7 @@ from flask import request from flask_restx import Resource, fields, marshal, marshal_with, reqparse from controllers.common.errors import NoFileUploadedError, TooManyFilesError -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.wraps import ( account_initialization_required, cloud_edition_billing_resource_check, @@ -23,11 +23,11 @@ from services.annotation_service import AppAnnotationService @console_ns.route("/apps//annotation-reply/") class AnnotationReplyActionApi(Resource): - @api.doc("annotation_reply_action") - @api.doc(description="Enable or disable annotation reply for an app") - @api.doc(params={"app_id": "Application ID", "action": "Action to perform (enable/disable)"}) - @api.expect( - api.model( + @console_ns.doc("annotation_reply_action") + @console_ns.doc(description="Enable or disable annotation reply for an app") + @console_ns.doc(params={"app_id": "Application ID", "action": "Action to perform (enable/disable)"}) + @console_ns.expect( + console_ns.model( "AnnotationReplyActionRequest", { "score_threshold": fields.Float(required=True, description="Score threshold for annotation matching"), @@ -36,8 +36,8 @@ class AnnotationReplyActionApi(Resource): }, ) ) - @api.response(200, "Action completed successfully") - @api.response(403, "Insufficient permissions") + @console_ns.response(200, "Action completed successfully") + @console_ns.response(403, "Insufficient permissions") @setup_required @login_required @account_initialization_required @@ -61,11 +61,11 @@ class AnnotationReplyActionApi(Resource): @console_ns.route("/apps//annotation-setting") class AppAnnotationSettingDetailApi(Resource): - @api.doc("get_annotation_setting") - @api.doc(description="Get annotation settings for an app") - @api.doc(params={"app_id": "Application ID"}) - @api.response(200, "Annotation settings retrieved successfully") - @api.response(403, "Insufficient permissions") + @console_ns.doc("get_annotation_setting") + @console_ns.doc(description="Get annotation settings for an app") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.response(200, "Annotation settings retrieved successfully") + @console_ns.response(403, "Insufficient permissions") @setup_required @login_required @account_initialization_required @@ -78,11 +78,11 @@ class AppAnnotationSettingDetailApi(Resource): @console_ns.route("/apps//annotation-settings/") class AppAnnotationSettingUpdateApi(Resource): - @api.doc("update_annotation_setting") - @api.doc(description="Update annotation settings for an app") - @api.doc(params={"app_id": "Application ID", "annotation_setting_id": "Annotation setting ID"}) - @api.expect( - api.model( + @console_ns.doc("update_annotation_setting") + @console_ns.doc(description="Update annotation settings for an app") + @console_ns.doc(params={"app_id": "Application ID", "annotation_setting_id": "Annotation setting ID"}) + @console_ns.expect( + console_ns.model( "AnnotationSettingUpdateRequest", { "score_threshold": fields.Float(required=True, description="Score threshold"), @@ -91,8 +91,8 @@ class AppAnnotationSettingUpdateApi(Resource): }, ) ) - @api.response(200, "Settings updated successfully") - @api.response(403, "Insufficient permissions") + @console_ns.response(200, "Settings updated successfully") + @console_ns.response(403, "Insufficient permissions") @setup_required @login_required @account_initialization_required @@ -110,11 +110,11 @@ class AppAnnotationSettingUpdateApi(Resource): @console_ns.route("/apps//annotation-reply//status/") class AnnotationReplyActionStatusApi(Resource): - @api.doc("get_annotation_reply_action_status") - @api.doc(description="Get status of annotation reply action job") - @api.doc(params={"app_id": "Application ID", "job_id": "Job ID", "action": "Action type"}) - @api.response(200, "Job status retrieved successfully") - @api.response(403, "Insufficient permissions") + @console_ns.doc("get_annotation_reply_action_status") + @console_ns.doc(description="Get status of annotation reply action job") + @console_ns.doc(params={"app_id": "Application ID", "job_id": "Job ID", "action": "Action type"}) + @console_ns.response(200, "Job status retrieved successfully") + @console_ns.response(403, "Insufficient permissions") @setup_required @login_required @account_initialization_required @@ -138,17 +138,17 @@ class AnnotationReplyActionStatusApi(Resource): @console_ns.route("/apps//annotations") class AnnotationApi(Resource): - @api.doc("list_annotations") - @api.doc(description="Get annotations for an app with pagination") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.parser() + @console_ns.doc("list_annotations") + @console_ns.doc(description="Get annotations for an app with pagination") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.parser() .add_argument("page", type=int, location="args", default=1, help="Page number") .add_argument("limit", type=int, location="args", default=20, help="Page size") .add_argument("keyword", type=str, location="args", default="", help="Search keyword") ) - @api.response(200, "Annotations retrieved successfully") - @api.response(403, "Insufficient permissions") + @console_ns.response(200, "Annotations retrieved successfully") + @console_ns.response(403, "Insufficient permissions") @setup_required @login_required @account_initialization_required @@ -169,11 +169,11 @@ class AnnotationApi(Resource): } return response, 200 - @api.doc("create_annotation") - @api.doc(description="Create a new annotation for an app") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.model( + @console_ns.doc("create_annotation") + @console_ns.doc(description="Create a new annotation for an app") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.model( "CreateAnnotationRequest", { "message_id": fields.String(description="Message ID (optional)"), @@ -184,8 +184,8 @@ class AnnotationApi(Resource): }, ) ) - @api.response(201, "Annotation created successfully", annotation_fields) - @api.response(403, "Insufficient permissions") + @console_ns.response(201, "Annotation created successfully", annotation_fields) + @console_ns.response(403, "Insufficient permissions") @setup_required @login_required @account_initialization_required @@ -235,11 +235,11 @@ class AnnotationApi(Resource): @console_ns.route("/apps//annotations/export") class AnnotationExportApi(Resource): - @api.doc("export_annotations") - @api.doc(description="Export all annotations for an app") - @api.doc(params={"app_id": "Application ID"}) - @api.response(200, "Annotations exported successfully", fields.List(fields.Nested(annotation_fields))) - @api.response(403, "Insufficient permissions") + @console_ns.doc("export_annotations") + @console_ns.doc(description="Export all annotations for an app") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.response(200, "Annotations exported successfully", fields.List(fields.Nested(annotation_fields))) + @console_ns.response(403, "Insufficient permissions") @setup_required @login_required @account_initialization_required @@ -260,13 +260,13 @@ parser = ( @console_ns.route("/apps//annotations/") class AnnotationUpdateDeleteApi(Resource): - @api.doc("update_delete_annotation") - @api.doc(description="Update or delete an annotation") - @api.doc(params={"app_id": "Application ID", "annotation_id": "Annotation ID"}) - @api.response(200, "Annotation updated successfully", annotation_fields) - @api.response(204, "Annotation deleted successfully") - @api.response(403, "Insufficient permissions") - @api.expect(parser) + @console_ns.doc("update_delete_annotation") + @console_ns.doc(description="Update or delete an annotation") + @console_ns.doc(params={"app_id": "Application ID", "annotation_id": "Annotation ID"}) + @console_ns.response(200, "Annotation updated successfully", annotation_fields) + @console_ns.response(204, "Annotation deleted successfully") + @console_ns.response(403, "Insufficient permissions") + @console_ns.expect(parser) @setup_required @login_required @account_initialization_required @@ -293,12 +293,12 @@ class AnnotationUpdateDeleteApi(Resource): @console_ns.route("/apps//annotations/batch-import") class AnnotationBatchImportApi(Resource): - @api.doc("batch_import_annotations") - @api.doc(description="Batch import annotations from CSV file") - @api.doc(params={"app_id": "Application ID"}) - @api.response(200, "Batch import started successfully") - @api.response(403, "Insufficient permissions") - @api.response(400, "No file uploaded or too many files") + @console_ns.doc("batch_import_annotations") + @console_ns.doc(description="Batch import annotations from CSV file") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.response(200, "Batch import started successfully") + @console_ns.response(403, "Insufficient permissions") + @console_ns.response(400, "No file uploaded or too many files") @setup_required @login_required @account_initialization_required @@ -323,11 +323,11 @@ class AnnotationBatchImportApi(Resource): @console_ns.route("/apps//annotations/batch-import-status/") class AnnotationBatchImportStatusApi(Resource): - @api.doc("get_batch_import_status") - @api.doc(description="Get status of batch import job") - @api.doc(params={"app_id": "Application ID", "job_id": "Job ID"}) - @api.response(200, "Job status retrieved successfully") - @api.response(403, "Insufficient permissions") + @console_ns.doc("get_batch_import_status") + @console_ns.doc(description="Get status of batch import job") + @console_ns.doc(params={"app_id": "Application ID", "job_id": "Job ID"}) + @console_ns.response(200, "Job status retrieved successfully") + @console_ns.response(403, "Insufficient permissions") @setup_required @login_required @account_initialization_required @@ -350,18 +350,18 @@ class AnnotationBatchImportStatusApi(Resource): @console_ns.route("/apps//annotations//hit-histories") class AnnotationHitHistoryListApi(Resource): - @api.doc("list_annotation_hit_histories") - @api.doc(description="Get hit histories for an annotation") - @api.doc(params={"app_id": "Application ID", "annotation_id": "Annotation ID"}) - @api.expect( - api.parser() + @console_ns.doc("list_annotation_hit_histories") + @console_ns.doc(description="Get hit histories for an annotation") + @console_ns.doc(params={"app_id": "Application ID", "annotation_id": "Annotation ID"}) + @console_ns.expect( + console_ns.parser() .add_argument("page", type=int, location="args", default=1, help="Page number") .add_argument("limit", type=int, location="args", default=20, help="Page size") ) - @api.response( + @console_ns.response( 200, "Hit histories retrieved successfully", fields.List(fields.Nested(annotation_hit_history_fields)) ) - @api.response(403, "Insufficient permissions") + @console_ns.response(403, "Insufficient permissions") @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/app/app.py b/api/controllers/console/app/app.py index a487512961..85a46aa9c3 100644 --- a/api/controllers/console/app/app.py +++ b/api/controllers/console/app/app.py @@ -5,7 +5,7 @@ from sqlalchemy import select from sqlalchemy.orm import Session from werkzeug.exceptions import BadRequest, abort -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.app.wraps import get_app_model from controllers.console.wraps import ( account_initialization_required, @@ -32,10 +32,10 @@ ALLOW_CREATE_APP_MODES = ["chat", "agent-chat", "advanced-chat", "workflow", "co @console_ns.route("/apps") class AppListApi(Resource): - @api.doc("list_apps") - @api.doc(description="Get list of applications with pagination and filtering") - @api.expect( - api.parser() + @console_ns.doc("list_apps") + @console_ns.doc(description="Get list of applications with pagination and filtering") + @console_ns.expect( + console_ns.parser() .add_argument("page", type=int, location="args", help="Page number (1-99999)", default=1) .add_argument("limit", type=int, location="args", help="Page size (1-100)", default=20) .add_argument( @@ -50,7 +50,7 @@ class AppListApi(Resource): .add_argument("tag_ids", type=str, location="args", help="Comma-separated tag IDs") .add_argument("is_created_by_me", type=bool, location="args", help="Filter by creator") ) - @api.response(200, "Success", app_pagination_fields) + @console_ns.response(200, "Success", app_pagination_fields) @setup_required @login_required @account_initialization_required @@ -139,10 +139,10 @@ class AppListApi(Resource): return marshal(app_pagination, app_pagination_fields), 200 - @api.doc("create_app") - @api.doc(description="Create a new application") - @api.expect( - api.model( + @console_ns.doc("create_app") + @console_ns.doc(description="Create a new application") + @console_ns.expect( + console_ns.model( "CreateAppRequest", { "name": fields.String(required=True, description="App name"), @@ -154,9 +154,9 @@ class AppListApi(Resource): }, ) ) - @api.response(201, "App created successfully", app_detail_fields) - @api.response(403, "Insufficient permissions") - @api.response(400, "Invalid request parameters") + @console_ns.response(201, "App created successfully", app_detail_fields) + @console_ns.response(403, "Insufficient permissions") + @console_ns.response(400, "Invalid request parameters") @setup_required @login_required @account_initialization_required @@ -188,10 +188,10 @@ class AppListApi(Resource): @console_ns.route("/apps/") class AppApi(Resource): - @api.doc("get_app_detail") - @api.doc(description="Get application details") - @api.doc(params={"app_id": "Application ID"}) - @api.response(200, "Success", app_detail_fields_with_site) + @console_ns.doc("get_app_detail") + @console_ns.doc(description="Get application details") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.response(200, "Success", app_detail_fields_with_site) @setup_required @login_required @account_initialization_required @@ -210,11 +210,11 @@ class AppApi(Resource): return app_model - @api.doc("update_app") - @api.doc(description="Update application details") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.model( + @console_ns.doc("update_app") + @console_ns.doc(description="Update application details") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.model( "UpdateAppRequest", { "name": fields.String(required=True, description="App name"), @@ -227,9 +227,9 @@ class AppApi(Resource): }, ) ) - @api.response(200, "App updated successfully", app_detail_fields_with_site) - @api.response(403, "Insufficient permissions") - @api.response(400, "Invalid request parameters") + @console_ns.response(200, "App updated successfully", app_detail_fields_with_site) + @console_ns.response(403, "Insufficient permissions") + @console_ns.response(400, "Invalid request parameters") @setup_required @login_required @account_initialization_required @@ -265,11 +265,11 @@ class AppApi(Resource): return app_model - @api.doc("delete_app") - @api.doc(description="Delete application") - @api.doc(params={"app_id": "Application ID"}) - @api.response(204, "App deleted successfully") - @api.response(403, "Insufficient permissions") + @console_ns.doc("delete_app") + @console_ns.doc(description="Delete application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.response(204, "App deleted successfully") + @console_ns.response(403, "Insufficient permissions") @get_app_model @setup_required @login_required @@ -285,11 +285,11 @@ class AppApi(Resource): @console_ns.route("/apps//copy") class AppCopyApi(Resource): - @api.doc("copy_app") - @api.doc(description="Create a copy of an existing application") - @api.doc(params={"app_id": "Application ID to copy"}) - @api.expect( - api.model( + @console_ns.doc("copy_app") + @console_ns.doc(description="Create a copy of an existing application") + @console_ns.doc(params={"app_id": "Application ID to copy"}) + @console_ns.expect( + console_ns.model( "CopyAppRequest", { "name": fields.String(description="Name for the copied app"), @@ -300,8 +300,8 @@ class AppCopyApi(Resource): }, ) ) - @api.response(201, "App copied successfully", app_detail_fields_with_site) - @api.response(403, "Insufficient permissions") + @console_ns.response(201, "App copied successfully", app_detail_fields_with_site) + @console_ns.response(403, "Insufficient permissions") @setup_required @login_required @account_initialization_required @@ -346,20 +346,20 @@ class AppCopyApi(Resource): @console_ns.route("/apps//export") class AppExportApi(Resource): - @api.doc("export_app") - @api.doc(description="Export application configuration as DSL") - @api.doc(params={"app_id": "Application ID to export"}) - @api.expect( - api.parser() + @console_ns.doc("export_app") + @console_ns.doc(description="Export application configuration as DSL") + @console_ns.doc(params={"app_id": "Application ID to export"}) + @console_ns.expect( + console_ns.parser() .add_argument("include_secret", type=bool, location="args", default=False, help="Include secrets in export") .add_argument("workflow_id", type=str, location="args", help="Specific workflow ID to export") ) - @api.response( + @console_ns.response( 200, "App exported successfully", - api.model("AppExportResponse", {"data": fields.String(description="DSL export data")}), + console_ns.model("AppExportResponse", {"data": fields.String(description="DSL export data")}), ) - @api.response(403, "Insufficient permissions") + @console_ns.response(403, "Insufficient permissions") @get_app_model @setup_required @login_required @@ -387,11 +387,11 @@ parser = reqparse.RequestParser().add_argument("name", type=str, required=True, @console_ns.route("/apps//name") class AppNameApi(Resource): - @api.doc("check_app_name") - @api.doc(description="Check if app name is available") - @api.doc(params={"app_id": "Application ID"}) - @api.expect(parser) - @api.response(200, "Name availability checked") + @console_ns.doc("check_app_name") + @console_ns.doc(description="Check if app name is available") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect(parser) + @console_ns.response(200, "Name availability checked") @setup_required @login_required @account_initialization_required @@ -409,11 +409,11 @@ class AppNameApi(Resource): @console_ns.route("/apps//icon") class AppIconApi(Resource): - @api.doc("update_app_icon") - @api.doc(description="Update application icon") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.model( + @console_ns.doc("update_app_icon") + @console_ns.doc(description="Update application icon") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.model( "AppIconRequest", { "icon": fields.String(required=True, description="Icon data"), @@ -422,8 +422,8 @@ class AppIconApi(Resource): }, ) ) - @api.response(200, "Icon updated successfully") - @api.response(403, "Insufficient permissions") + @console_ns.response(200, "Icon updated successfully") + @console_ns.response(403, "Insufficient permissions") @setup_required @login_required @account_initialization_required @@ -446,16 +446,16 @@ class AppIconApi(Resource): @console_ns.route("/apps//site-enable") class AppSiteStatus(Resource): - @api.doc("update_app_site_status") - @api.doc(description="Enable or disable app site") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.model( + @console_ns.doc("update_app_site_status") + @console_ns.doc(description="Enable or disable app site") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.model( "AppSiteStatusRequest", {"enable_site": fields.Boolean(required=True, description="Enable or disable site")} ) ) - @api.response(200, "Site status updated successfully", app_detail_fields) - @api.response(403, "Insufficient permissions") + @console_ns.response(200, "Site status updated successfully", app_detail_fields) + @console_ns.response(403, "Insufficient permissions") @setup_required @login_required @account_initialization_required @@ -474,16 +474,16 @@ class AppSiteStatus(Resource): @console_ns.route("/apps//api-enable") class AppApiStatus(Resource): - @api.doc("update_app_api_status") - @api.doc(description="Enable or disable app API") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.model( + @console_ns.doc("update_app_api_status") + @console_ns.doc(description="Enable or disable app API") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.model( "AppApiStatusRequest", {"enable_api": fields.Boolean(required=True, description="Enable or disable API")} ) ) - @api.response(200, "API status updated successfully", app_detail_fields) - @api.response(403, "Insufficient permissions") + @console_ns.response(200, "API status updated successfully", app_detail_fields) + @console_ns.response(403, "Insufficient permissions") @setup_required @login_required @is_admin_or_owner_required @@ -502,10 +502,10 @@ class AppApiStatus(Resource): @console_ns.route("/apps//trace") class AppTraceApi(Resource): - @api.doc("get_app_trace") - @api.doc(description="Get app tracing configuration") - @api.doc(params={"app_id": "Application ID"}) - @api.response(200, "Trace configuration retrieved successfully") + @console_ns.doc("get_app_trace") + @console_ns.doc(description="Get app tracing configuration") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.response(200, "Trace configuration retrieved successfully") @setup_required @login_required @account_initialization_required @@ -515,11 +515,11 @@ class AppTraceApi(Resource): return app_trace_config - @api.doc("update_app_trace") - @api.doc(description="Update app tracing configuration") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.model( + @console_ns.doc("update_app_trace") + @console_ns.doc(description="Update app tracing configuration") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.model( "AppTraceRequest", { "enabled": fields.Boolean(required=True, description="Enable or disable tracing"), @@ -527,8 +527,8 @@ class AppTraceApi(Resource): }, ) ) - @api.response(200, "Trace configuration updated successfully") - @api.response(403, "Insufficient permissions") + @console_ns.response(200, "Trace configuration updated successfully") + @console_ns.response(403, "Insufficient permissions") @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/app/app_import.py b/api/controllers/console/app/app_import.py index 02dbd42515..35a3393742 100644 --- a/api/controllers/console/app/app_import.py +++ b/api/controllers/console/app/app_import.py @@ -1,7 +1,6 @@ from flask_restx import Resource, marshal_with, reqparse from sqlalchemy.orm import Session -from controllers.console import api from controllers.console.app.wraps import get_app_model from controllers.console.wraps import ( account_initialization_required, @@ -35,7 +34,7 @@ parser = ( @console_ns.route("/apps/imports") class AppImportApi(Resource): - @api.expect(parser) + @console_ns.expect(parser) @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/app/audio.py b/api/controllers/console/app/audio.py index 8170ba271a..86446f1164 100644 --- a/api/controllers/console/app/audio.py +++ b/api/controllers/console/app/audio.py @@ -5,7 +5,7 @@ from flask_restx import Resource, fields, reqparse from werkzeug.exceptions import InternalServerError import services -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.app.error import ( AppUnavailableError, AudioTooLargeError, @@ -36,16 +36,16 @@ logger = logging.getLogger(__name__) @console_ns.route("/apps//audio-to-text") class ChatMessageAudioApi(Resource): - @api.doc("chat_message_audio_transcript") - @api.doc(description="Transcript audio to text for chat messages") - @api.doc(params={"app_id": "App ID"}) - @api.response( + @console_ns.doc("chat_message_audio_transcript") + @console_ns.doc(description="Transcript audio to text for chat messages") + @console_ns.doc(params={"app_id": "App ID"}) + @console_ns.response( 200, "Audio transcription successful", - api.model("AudioTranscriptResponse", {"text": fields.String(description="Transcribed text from audio")}), + console_ns.model("AudioTranscriptResponse", {"text": fields.String(description="Transcribed text from audio")}), ) - @api.response(400, "Bad request - No audio uploaded or unsupported type") - @api.response(413, "Audio file too large") + @console_ns.response(400, "Bad request - No audio uploaded or unsupported type") + @console_ns.response(413, "Audio file too large") @setup_required @login_required @account_initialization_required @@ -89,11 +89,11 @@ class ChatMessageAudioApi(Resource): @console_ns.route("/apps//text-to-audio") class ChatMessageTextApi(Resource): - @api.doc("chat_message_text_to_speech") - @api.doc(description="Convert text to speech for chat messages") - @api.doc(params={"app_id": "App ID"}) - @api.expect( - api.model( + @console_ns.doc("chat_message_text_to_speech") + @console_ns.doc(description="Convert text to speech for chat messages") + @console_ns.doc(params={"app_id": "App ID"}) + @console_ns.expect( + console_ns.model( "TextToSpeechRequest", { "message_id": fields.String(description="Message ID"), @@ -103,8 +103,8 @@ class ChatMessageTextApi(Resource): }, ) ) - @api.response(200, "Text to speech conversion successful") - @api.response(400, "Bad request - Invalid parameters") + @console_ns.response(200, "Text to speech conversion successful") + @console_ns.response(400, "Bad request - Invalid parameters") @get_app_model @setup_required @login_required @@ -156,12 +156,16 @@ class ChatMessageTextApi(Resource): @console_ns.route("/apps//text-to-audio/voices") class TextModesApi(Resource): - @api.doc("get_text_to_speech_voices") - @api.doc(description="Get available TTS voices for a specific language") - @api.doc(params={"app_id": "App ID"}) - @api.expect(api.parser().add_argument("language", type=str, required=True, location="args", help="Language code")) - @api.response(200, "TTS voices retrieved successfully", fields.List(fields.Raw(description="Available voices"))) - @api.response(400, "Invalid language parameter") + @console_ns.doc("get_text_to_speech_voices") + @console_ns.doc(description="Get available TTS voices for a specific language") + @console_ns.doc(params={"app_id": "App ID"}) + @console_ns.expect( + console_ns.parser().add_argument("language", type=str, required=True, location="args", help="Language code") + ) + @console_ns.response( + 200, "TTS voices retrieved successfully", fields.List(fields.Raw(description="Available voices")) + ) + @console_ns.response(400, "Invalid language parameter") @get_app_model @setup_required @login_required diff --git a/api/controllers/console/app/completion.py b/api/controllers/console/app/completion.py index d7bc3cc20d..031a95e178 100644 --- a/api/controllers/console/app/completion.py +++ b/api/controllers/console/app/completion.py @@ -5,7 +5,7 @@ from flask_restx import Resource, fields, reqparse from werkzeug.exceptions import InternalServerError, NotFound import services -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.app.error import ( AppUnavailableError, CompletionRequestError, @@ -40,11 +40,11 @@ logger = logging.getLogger(__name__) # define completion message api for user @console_ns.route("/apps//completion-messages") class CompletionMessageApi(Resource): - @api.doc("create_completion_message") - @api.doc(description="Generate completion message for debugging") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.model( + @console_ns.doc("create_completion_message") + @console_ns.doc(description="Generate completion message for debugging") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.model( "CompletionMessageRequest", { "inputs": fields.Raw(required=True, description="Input variables"), @@ -56,9 +56,9 @@ class CompletionMessageApi(Resource): }, ) ) - @api.response(200, "Completion generated successfully") - @api.response(400, "Invalid request parameters") - @api.response(404, "App not found") + @console_ns.response(200, "Completion generated successfully") + @console_ns.response(400, "Invalid request parameters") + @console_ns.response(404, "App not found") @setup_required @login_required @account_initialization_required @@ -110,10 +110,10 @@ class CompletionMessageApi(Resource): @console_ns.route("/apps//completion-messages//stop") class CompletionMessageStopApi(Resource): - @api.doc("stop_completion_message") - @api.doc(description="Stop a running completion message generation") - @api.doc(params={"app_id": "Application ID", "task_id": "Task ID to stop"}) - @api.response(200, "Task stopped successfully") + @console_ns.doc("stop_completion_message") + @console_ns.doc(description="Stop a running completion message generation") + @console_ns.doc(params={"app_id": "Application ID", "task_id": "Task ID to stop"}) + @console_ns.response(200, "Task stopped successfully") @setup_required @login_required @account_initialization_required @@ -128,11 +128,11 @@ class CompletionMessageStopApi(Resource): @console_ns.route("/apps//chat-messages") class ChatMessageApi(Resource): - @api.doc("create_chat_message") - @api.doc(description="Generate chat message for debugging") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.model( + @console_ns.doc("create_chat_message") + @console_ns.doc(description="Generate chat message for debugging") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.model( "ChatMessageRequest", { "inputs": fields.Raw(required=True, description="Input variables"), @@ -146,9 +146,9 @@ class ChatMessageApi(Resource): }, ) ) - @api.response(200, "Chat message generated successfully") - @api.response(400, "Invalid request parameters") - @api.response(404, "App or conversation not found") + @console_ns.response(200, "Chat message generated successfully") + @console_ns.response(400, "Invalid request parameters") + @console_ns.response(404, "App or conversation not found") @setup_required @login_required @account_initialization_required @@ -209,10 +209,10 @@ class ChatMessageApi(Resource): @console_ns.route("/apps//chat-messages//stop") class ChatMessageStopApi(Resource): - @api.doc("stop_chat_message") - @api.doc(description="Stop a running chat message generation") - @api.doc(params={"app_id": "Application ID", "task_id": "Task ID to stop"}) - @api.response(200, "Task stopped successfully") + @console_ns.doc("stop_chat_message") + @console_ns.doc(description="Stop a running chat message generation") + @console_ns.doc(params={"app_id": "Application ID", "task_id": "Task ID to stop"}) + @console_ns.response(200, "Task stopped successfully") @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/app/conversation.py b/api/controllers/console/app/conversation.py index 57b6c314f3..e102300438 100644 --- a/api/controllers/console/app/conversation.py +++ b/api/controllers/console/app/conversation.py @@ -6,7 +6,7 @@ from sqlalchemy import func, or_ from sqlalchemy.orm import joinedload from werkzeug.exceptions import NotFound -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.app.wraps import get_app_model from controllers.console.wraps import account_initialization_required, edit_permission_required, setup_required from core.app.entities.app_invoke_entities import InvokeFrom @@ -28,11 +28,11 @@ from services.errors.conversation import ConversationNotExistsError @console_ns.route("/apps//completion-conversations") class CompletionConversationApi(Resource): - @api.doc("list_completion_conversations") - @api.doc(description="Get completion conversations with pagination and filtering") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.parser() + @console_ns.doc("list_completion_conversations") + @console_ns.doc(description="Get completion conversations with pagination and filtering") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.parser() .add_argument("keyword", type=str, location="args", help="Search keyword") .add_argument("start", type=str, location="args", help="Start date (YYYY-MM-DD HH:MM)") .add_argument("end", type=str, location="args", help="End date (YYYY-MM-DD HH:MM)") @@ -47,8 +47,8 @@ class CompletionConversationApi(Resource): .add_argument("page", type=int, location="args", default=1, help="Page number") .add_argument("limit", type=int, location="args", default=20, help="Page size (1-100)") ) - @api.response(200, "Success", conversation_pagination_fields) - @api.response(403, "Insufficient permissions") + @console_ns.response(200, "Success", conversation_pagination_fields) + @console_ns.response(403, "Insufficient permissions") @setup_required @login_required @account_initialization_required @@ -122,12 +122,12 @@ class CompletionConversationApi(Resource): @console_ns.route("/apps//completion-conversations/") class CompletionConversationDetailApi(Resource): - @api.doc("get_completion_conversation") - @api.doc(description="Get completion conversation details with messages") - @api.doc(params={"app_id": "Application ID", "conversation_id": "Conversation ID"}) - @api.response(200, "Success", conversation_message_detail_fields) - @api.response(403, "Insufficient permissions") - @api.response(404, "Conversation not found") + @console_ns.doc("get_completion_conversation") + @console_ns.doc(description="Get completion conversation details with messages") + @console_ns.doc(params={"app_id": "Application ID", "conversation_id": "Conversation ID"}) + @console_ns.response(200, "Success", conversation_message_detail_fields) + @console_ns.response(403, "Insufficient permissions") + @console_ns.response(404, "Conversation not found") @setup_required @login_required @account_initialization_required @@ -139,12 +139,12 @@ class CompletionConversationDetailApi(Resource): return _get_conversation(app_model, conversation_id) - @api.doc("delete_completion_conversation") - @api.doc(description="Delete a completion conversation") - @api.doc(params={"app_id": "Application ID", "conversation_id": "Conversation ID"}) - @api.response(204, "Conversation deleted successfully") - @api.response(403, "Insufficient permissions") - @api.response(404, "Conversation not found") + @console_ns.doc("delete_completion_conversation") + @console_ns.doc(description="Delete a completion conversation") + @console_ns.doc(params={"app_id": "Application ID", "conversation_id": "Conversation ID"}) + @console_ns.response(204, "Conversation deleted successfully") + @console_ns.response(403, "Insufficient permissions") + @console_ns.response(404, "Conversation not found") @setup_required @login_required @account_initialization_required @@ -164,11 +164,11 @@ class CompletionConversationDetailApi(Resource): @console_ns.route("/apps//chat-conversations") class ChatConversationApi(Resource): - @api.doc("list_chat_conversations") - @api.doc(description="Get chat conversations with pagination, filtering and summary") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.parser() + @console_ns.doc("list_chat_conversations") + @console_ns.doc(description="Get chat conversations with pagination, filtering and summary") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.parser() .add_argument("keyword", type=str, location="args", help="Search keyword") .add_argument("start", type=str, location="args", help="Start date (YYYY-MM-DD HH:MM)") .add_argument("end", type=str, location="args", help="End date (YYYY-MM-DD HH:MM)") @@ -192,8 +192,8 @@ class ChatConversationApi(Resource): help="Sort field and direction", ) ) - @api.response(200, "Success", conversation_with_summary_pagination_fields) - @api.response(403, "Insufficient permissions") + @console_ns.response(200, "Success", conversation_with_summary_pagination_fields) + @console_ns.response(403, "Insufficient permissions") @setup_required @login_required @account_initialization_required @@ -322,12 +322,12 @@ class ChatConversationApi(Resource): @console_ns.route("/apps//chat-conversations/") class ChatConversationDetailApi(Resource): - @api.doc("get_chat_conversation") - @api.doc(description="Get chat conversation details") - @api.doc(params={"app_id": "Application ID", "conversation_id": "Conversation ID"}) - @api.response(200, "Success", conversation_detail_fields) - @api.response(403, "Insufficient permissions") - @api.response(404, "Conversation not found") + @console_ns.doc("get_chat_conversation") + @console_ns.doc(description="Get chat conversation details") + @console_ns.doc(params={"app_id": "Application ID", "conversation_id": "Conversation ID"}) + @console_ns.response(200, "Success", conversation_detail_fields) + @console_ns.response(403, "Insufficient permissions") + @console_ns.response(404, "Conversation not found") @setup_required @login_required @account_initialization_required @@ -339,12 +339,12 @@ class ChatConversationDetailApi(Resource): return _get_conversation(app_model, conversation_id) - @api.doc("delete_chat_conversation") - @api.doc(description="Delete a chat conversation") - @api.doc(params={"app_id": "Application ID", "conversation_id": "Conversation ID"}) - @api.response(204, "Conversation deleted successfully") - @api.response(403, "Insufficient permissions") - @api.response(404, "Conversation not found") + @console_ns.doc("delete_chat_conversation") + @console_ns.doc(description="Delete a chat conversation") + @console_ns.doc(params={"app_id": "Application ID", "conversation_id": "Conversation ID"}) + @console_ns.response(204, "Conversation deleted successfully") + @console_ns.response(403, "Insufficient permissions") + @console_ns.response(404, "Conversation not found") @setup_required @login_required @get_app_model(mode=[AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT]) diff --git a/api/controllers/console/app/conversation_variables.py b/api/controllers/console/app/conversation_variables.py index d4c0b5697f..15ea004143 100644 --- a/api/controllers/console/app/conversation_variables.py +++ b/api/controllers/console/app/conversation_variables.py @@ -2,7 +2,7 @@ from flask_restx import Resource, marshal_with, reqparse from sqlalchemy import select from sqlalchemy.orm import Session -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.app.wraps import get_app_model from controllers.console.wraps import account_initialization_required, setup_required from extensions.ext_database import db @@ -14,15 +14,15 @@ from models.model import AppMode @console_ns.route("/apps//conversation-variables") class ConversationVariablesApi(Resource): - @api.doc("get_conversation_variables") - @api.doc(description="Get conversation variables for an application") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.parser().add_argument( + @console_ns.doc("get_conversation_variables") + @console_ns.doc(description="Get conversation variables for an application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.parser().add_argument( "conversation_id", type=str, location="args", help="Conversation ID to filter variables" ) ) - @api.response(200, "Conversation variables retrieved successfully", paginated_conversation_variable_fields) + @console_ns.response(200, "Conversation variables retrieved successfully", paginated_conversation_variable_fields) @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/app/generator.py b/api/controllers/console/app/generator.py index 54a101946c..cf8acda018 100644 --- a/api/controllers/console/app/generator.py +++ b/api/controllers/console/app/generator.py @@ -2,7 +2,7 @@ from collections.abc import Sequence from flask_restx import Resource, fields, reqparse -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.app.error import ( CompletionRequestError, ProviderModelCurrentlyNotSupportError, @@ -24,10 +24,10 @@ from services.workflow_service import WorkflowService @console_ns.route("/rule-generate") class RuleGenerateApi(Resource): - @api.doc("generate_rule_config") - @api.doc(description="Generate rule configuration using LLM") - @api.expect( - api.model( + @console_ns.doc("generate_rule_config") + @console_ns.doc(description="Generate rule configuration using LLM") + @console_ns.expect( + console_ns.model( "RuleGenerateRequest", { "instruction": fields.String(required=True, description="Rule generation instruction"), @@ -36,9 +36,9 @@ class RuleGenerateApi(Resource): }, ) ) - @api.response(200, "Rule configuration generated successfully") - @api.response(400, "Invalid request parameters") - @api.response(402, "Provider quota exceeded") + @console_ns.response(200, "Rule configuration generated successfully") + @console_ns.response(400, "Invalid request parameters") + @console_ns.response(402, "Provider quota exceeded") @setup_required @login_required @account_initialization_required @@ -73,10 +73,10 @@ class RuleGenerateApi(Resource): @console_ns.route("/rule-code-generate") class RuleCodeGenerateApi(Resource): - @api.doc("generate_rule_code") - @api.doc(description="Generate code rules using LLM") - @api.expect( - api.model( + @console_ns.doc("generate_rule_code") + @console_ns.doc(description="Generate code rules using LLM") + @console_ns.expect( + console_ns.model( "RuleCodeGenerateRequest", { "instruction": fields.String(required=True, description="Code generation instruction"), @@ -88,9 +88,9 @@ class RuleCodeGenerateApi(Resource): }, ) ) - @api.response(200, "Code rules generated successfully") - @api.response(400, "Invalid request parameters") - @api.response(402, "Provider quota exceeded") + @console_ns.response(200, "Code rules generated successfully") + @console_ns.response(400, "Invalid request parameters") + @console_ns.response(402, "Provider quota exceeded") @setup_required @login_required @account_initialization_required @@ -126,10 +126,10 @@ class RuleCodeGenerateApi(Resource): @console_ns.route("/rule-structured-output-generate") class RuleStructuredOutputGenerateApi(Resource): - @api.doc("generate_structured_output") - @api.doc(description="Generate structured output rules using LLM") - @api.expect( - api.model( + @console_ns.doc("generate_structured_output") + @console_ns.doc(description="Generate structured output rules using LLM") + @console_ns.expect( + console_ns.model( "StructuredOutputGenerateRequest", { "instruction": fields.String(required=True, description="Structured output generation instruction"), @@ -137,9 +137,9 @@ class RuleStructuredOutputGenerateApi(Resource): }, ) ) - @api.response(200, "Structured output generated successfully") - @api.response(400, "Invalid request parameters") - @api.response(402, "Provider quota exceeded") + @console_ns.response(200, "Structured output generated successfully") + @console_ns.response(400, "Invalid request parameters") + @console_ns.response(402, "Provider quota exceeded") @setup_required @login_required @account_initialization_required @@ -172,10 +172,10 @@ class RuleStructuredOutputGenerateApi(Resource): @console_ns.route("/instruction-generate") class InstructionGenerateApi(Resource): - @api.doc("generate_instruction") - @api.doc(description="Generate instruction for workflow nodes or general use") - @api.expect( - api.model( + @console_ns.doc("generate_instruction") + @console_ns.doc(description="Generate instruction for workflow nodes or general use") + @console_ns.expect( + console_ns.model( "InstructionGenerateRequest", { "flow_id": fields.String(required=True, description="Workflow/Flow ID"), @@ -188,9 +188,9 @@ class InstructionGenerateApi(Resource): }, ) ) - @api.response(200, "Instruction generated successfully") - @api.response(400, "Invalid request parameters or flow/workflow not found") - @api.response(402, "Provider quota exceeded") + @console_ns.response(200, "Instruction generated successfully") + @console_ns.response(400, "Invalid request parameters or flow/workflow not found") + @console_ns.response(402, "Provider quota exceeded") @setup_required @login_required @account_initialization_required @@ -283,10 +283,10 @@ class InstructionGenerateApi(Resource): @console_ns.route("/instruction-generate/template") class InstructionGenerationTemplateApi(Resource): - @api.doc("get_instruction_template") - @api.doc(description="Get instruction generation template") - @api.expect( - api.model( + @console_ns.doc("get_instruction_template") + @console_ns.doc(description="Get instruction generation template") + @console_ns.expect( + console_ns.model( "InstructionTemplateRequest", { "instruction": fields.String(required=True, description="Template instruction"), @@ -294,8 +294,8 @@ class InstructionGenerationTemplateApi(Resource): }, ) ) - @api.response(200, "Template retrieved successfully") - @api.response(400, "Invalid request parameters") + @console_ns.response(200, "Template retrieved successfully") + @console_ns.response(400, "Invalid request parameters") @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/app/mcp_server.py b/api/controllers/console/app/mcp_server.py index 3700c6b1d0..7454d87068 100644 --- a/api/controllers/console/app/mcp_server.py +++ b/api/controllers/console/app/mcp_server.py @@ -4,7 +4,7 @@ from enum import StrEnum from flask_restx import Resource, fields, marshal_with, reqparse from werkzeug.exceptions import NotFound -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.app.wraps import get_app_model from controllers.console.wraps import account_initialization_required, edit_permission_required, setup_required from extensions.ext_database import db @@ -20,10 +20,10 @@ class AppMCPServerStatus(StrEnum): @console_ns.route("/apps//server") class AppMCPServerController(Resource): - @api.doc("get_app_mcp_server") - @api.doc(description="Get MCP server configuration for an application") - @api.doc(params={"app_id": "Application ID"}) - @api.response(200, "MCP server configuration retrieved successfully", app_server_fields) + @console_ns.doc("get_app_mcp_server") + @console_ns.doc(description="Get MCP server configuration for an application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.response(200, "MCP server configuration retrieved successfully", app_server_fields) @login_required @account_initialization_required @setup_required @@ -33,11 +33,11 @@ class AppMCPServerController(Resource): server = db.session.query(AppMCPServer).where(AppMCPServer.app_id == app_model.id).first() return server - @api.doc("create_app_mcp_server") - @api.doc(description="Create MCP server configuration for an application") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.model( + @console_ns.doc("create_app_mcp_server") + @console_ns.doc(description="Create MCP server configuration for an application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.model( "MCPServerCreateRequest", { "description": fields.String(description="Server description"), @@ -45,8 +45,8 @@ class AppMCPServerController(Resource): }, ) ) - @api.response(201, "MCP server configuration created successfully", app_server_fields) - @api.response(403, "Insufficient permissions") + @console_ns.response(201, "MCP server configuration created successfully", app_server_fields) + @console_ns.response(403, "Insufficient permissions") @account_initialization_required @get_app_model @login_required @@ -79,11 +79,11 @@ class AppMCPServerController(Resource): db.session.commit() return server - @api.doc("update_app_mcp_server") - @api.doc(description="Update MCP server configuration for an application") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.model( + @console_ns.doc("update_app_mcp_server") + @console_ns.doc(description="Update MCP server configuration for an application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.model( "MCPServerUpdateRequest", { "id": fields.String(required=True, description="Server ID"), @@ -93,9 +93,9 @@ class AppMCPServerController(Resource): }, ) ) - @api.response(200, "MCP server configuration updated successfully", app_server_fields) - @api.response(403, "Insufficient permissions") - @api.response(404, "Server not found") + @console_ns.response(200, "MCP server configuration updated successfully", app_server_fields) + @console_ns.response(403, "Insufficient permissions") + @console_ns.response(404, "Server not found") @get_app_model @login_required @setup_required @@ -134,12 +134,12 @@ class AppMCPServerController(Resource): @console_ns.route("/apps//server/refresh") class AppMCPServerRefreshController(Resource): - @api.doc("refresh_app_mcp_server") - @api.doc(description="Refresh MCP server configuration and regenerate server code") - @api.doc(params={"server_id": "Server ID"}) - @api.response(200, "MCP server refreshed successfully", app_server_fields) - @api.response(403, "Insufficient permissions") - @api.response(404, "Server not found") + @console_ns.doc("refresh_app_mcp_server") + @console_ns.doc(description="Refresh MCP server configuration and regenerate server code") + @console_ns.doc(params={"server_id": "Server ID"}) + @console_ns.response(200, "MCP server refreshed successfully", app_server_fields) + @console_ns.response(403, "Insufficient permissions") + @console_ns.response(404, "Server not found") @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/app/message.py b/api/controllers/console/app/message.py index 3f66278940..b6672c88e0 100644 --- a/api/controllers/console/app/message.py +++ b/api/controllers/console/app/message.py @@ -5,7 +5,7 @@ from flask_restx.inputs import int_range from sqlalchemy import exists, select from werkzeug.exceptions import InternalServerError, NotFound -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.app.error import ( CompletionRequestError, ProviderModelCurrentlyNotSupportError, @@ -43,17 +43,17 @@ class ChatMessageListApi(Resource): "data": fields.List(fields.Nested(message_detail_fields)), } - @api.doc("list_chat_messages") - @api.doc(description="Get chat messages for a conversation with pagination") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.parser() + @console_ns.doc("list_chat_messages") + @console_ns.doc(description="Get chat messages for a conversation with pagination") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.parser() .add_argument("conversation_id", type=str, required=True, location="args", help="Conversation ID") .add_argument("first_id", type=str, location="args", help="First message ID for pagination") .add_argument("limit", type=int, location="args", default=20, help="Number of messages to return (1-100)") ) - @api.response(200, "Success", message_infinite_scroll_pagination_fields) - @api.response(404, "Conversation not found") + @console_ns.response(200, "Success", message_infinite_scroll_pagination_fields) + @console_ns.response(404, "Conversation not found") @login_required @account_initialization_required @setup_required @@ -132,11 +132,11 @@ class ChatMessageListApi(Resource): @console_ns.route("/apps//feedbacks") class MessageFeedbackApi(Resource): - @api.doc("create_message_feedback") - @api.doc(description="Create or update message feedback (like/dislike)") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.model( + @console_ns.doc("create_message_feedback") + @console_ns.doc(description="Create or update message feedback (like/dislike)") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.model( "MessageFeedbackRequest", { "message_id": fields.String(required=True, description="Message ID"), @@ -144,9 +144,9 @@ class MessageFeedbackApi(Resource): }, ) ) - @api.response(200, "Feedback updated successfully") - @api.response(404, "Message not found") - @api.response(403, "Insufficient permissions") + @console_ns.response(200, "Feedback updated successfully") + @console_ns.response(404, "Message not found") + @console_ns.response(403, "Insufficient permissions") @get_app_model @setup_required @login_required @@ -194,13 +194,13 @@ class MessageFeedbackApi(Resource): @console_ns.route("/apps//annotations/count") class MessageAnnotationCountApi(Resource): - @api.doc("get_annotation_count") - @api.doc(description="Get count of message annotations for the app") - @api.doc(params={"app_id": "Application ID"}) - @api.response( + @console_ns.doc("get_annotation_count") + @console_ns.doc(description="Get count of message annotations for the app") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.response( 200, "Annotation count retrieved successfully", - api.model("AnnotationCountResponse", {"count": fields.Integer(description="Number of annotations")}), + console_ns.model("AnnotationCountResponse", {"count": fields.Integer(description="Number of annotations")}), ) @get_app_model @setup_required @@ -214,15 +214,17 @@ class MessageAnnotationCountApi(Resource): @console_ns.route("/apps//chat-messages//suggested-questions") class MessageSuggestedQuestionApi(Resource): - @api.doc("get_message_suggested_questions") - @api.doc(description="Get suggested questions for a message") - @api.doc(params={"app_id": "Application ID", "message_id": "Message ID"}) - @api.response( + @console_ns.doc("get_message_suggested_questions") + @console_ns.doc(description="Get suggested questions for a message") + @console_ns.doc(params={"app_id": "Application ID", "message_id": "Message ID"}) + @console_ns.response( 200, "Suggested questions retrieved successfully", - api.model("SuggestedQuestionsResponse", {"data": fields.List(fields.String(description="Suggested question"))}), + console_ns.model( + "SuggestedQuestionsResponse", {"data": fields.List(fields.String(description="Suggested question"))} + ), ) - @api.response(404, "Message or conversation not found") + @console_ns.response(404, "Message or conversation not found") @setup_required @login_required @account_initialization_required @@ -258,11 +260,11 @@ class MessageSuggestedQuestionApi(Resource): @console_ns.route("/apps//messages/") class MessageApi(Resource): - @api.doc("get_message") - @api.doc(description="Get message details by ID") - @api.doc(params={"app_id": "Application ID", "message_id": "Message ID"}) - @api.response(200, "Message retrieved successfully", message_detail_fields) - @api.response(404, "Message not found") + @console_ns.doc("get_message") + @console_ns.doc(description="Get message details by ID") + @console_ns.doc(params={"app_id": "Application ID", "message_id": "Message ID"}) + @console_ns.response(200, "Message retrieved successfully", message_detail_fields) + @console_ns.response(404, "Message not found") @get_app_model @setup_required @login_required diff --git a/api/controllers/console/app/model_config.py b/api/controllers/console/app/model_config.py index 91e2cfd60e..a85e54fb51 100644 --- a/api/controllers/console/app/model_config.py +++ b/api/controllers/console/app/model_config.py @@ -4,7 +4,7 @@ from typing import cast from flask import request from flask_restx import Resource, fields -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.app.wraps import get_app_model from controllers.console.wraps import account_initialization_required, edit_permission_required, setup_required from core.agent.entities import AgentToolEntity @@ -20,11 +20,11 @@ from services.app_model_config_service import AppModelConfigService @console_ns.route("/apps//model-config") class ModelConfigResource(Resource): - @api.doc("update_app_model_config") - @api.doc(description="Update application model configuration") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.model( + @console_ns.doc("update_app_model_config") + @console_ns.doc(description="Update application model configuration") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.model( "ModelConfigRequest", { "provider": fields.String(description="Model provider"), @@ -42,9 +42,9 @@ class ModelConfigResource(Resource): }, ) ) - @api.response(200, "Model configuration updated successfully") - @api.response(400, "Invalid configuration") - @api.response(404, "App not found") + @console_ns.response(200, "Model configuration updated successfully") + @console_ns.response(400, "Invalid configuration") + @console_ns.response(404, "App not found") @setup_required @login_required @edit_permission_required diff --git a/api/controllers/console/app/ops_trace.py b/api/controllers/console/app/ops_trace.py index 1d80314774..19c1a11258 100644 --- a/api/controllers/console/app/ops_trace.py +++ b/api/controllers/console/app/ops_trace.py @@ -1,7 +1,7 @@ from flask_restx import Resource, fields, reqparse from werkzeug.exceptions import BadRequest -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.app.error import TracingConfigCheckError, TracingConfigIsExist, TracingConfigNotExist from controllers.console.wraps import account_initialization_required, setup_required from libs.login import login_required @@ -14,18 +14,18 @@ class TraceAppConfigApi(Resource): Manage trace app configurations """ - @api.doc("get_trace_app_config") - @api.doc(description="Get tracing configuration for an application") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.parser().add_argument( + @console_ns.doc("get_trace_app_config") + @console_ns.doc(description="Get tracing configuration for an application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.parser().add_argument( "tracing_provider", type=str, required=True, location="args", help="Tracing provider name" ) ) - @api.response( + @console_ns.response( 200, "Tracing configuration retrieved successfully", fields.Raw(description="Tracing configuration data") ) - @api.response(400, "Invalid request parameters") + @console_ns.response(400, "Invalid request parameters") @setup_required @login_required @account_initialization_required @@ -41,11 +41,11 @@ class TraceAppConfigApi(Resource): except Exception as e: raise BadRequest(str(e)) - @api.doc("create_trace_app_config") - @api.doc(description="Create a new tracing configuration for an application") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.model( + @console_ns.doc("create_trace_app_config") + @console_ns.doc(description="Create a new tracing configuration for an application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.model( "TraceConfigCreateRequest", { "tracing_provider": fields.String(required=True, description="Tracing provider name"), @@ -53,10 +53,10 @@ class TraceAppConfigApi(Resource): }, ) ) - @api.response( + @console_ns.response( 201, "Tracing configuration created successfully", fields.Raw(description="Created configuration data") ) - @api.response(400, "Invalid request parameters or configuration already exists") + @console_ns.response(400, "Invalid request parameters or configuration already exists") @setup_required @login_required @account_initialization_required @@ -81,11 +81,11 @@ class TraceAppConfigApi(Resource): except Exception as e: raise BadRequest(str(e)) - @api.doc("update_trace_app_config") - @api.doc(description="Update an existing tracing configuration for an application") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.model( + @console_ns.doc("update_trace_app_config") + @console_ns.doc(description="Update an existing tracing configuration for an application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.model( "TraceConfigUpdateRequest", { "tracing_provider": fields.String(required=True, description="Tracing provider name"), @@ -93,8 +93,8 @@ class TraceAppConfigApi(Resource): }, ) ) - @api.response(200, "Tracing configuration updated successfully", fields.Raw(description="Success response")) - @api.response(400, "Invalid request parameters or configuration not found") + @console_ns.response(200, "Tracing configuration updated successfully", fields.Raw(description="Success response")) + @console_ns.response(400, "Invalid request parameters or configuration not found") @setup_required @login_required @account_initialization_required @@ -117,16 +117,16 @@ class TraceAppConfigApi(Resource): except Exception as e: raise BadRequest(str(e)) - @api.doc("delete_trace_app_config") - @api.doc(description="Delete an existing tracing configuration for an application") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.parser().add_argument( + @console_ns.doc("delete_trace_app_config") + @console_ns.doc(description="Delete an existing tracing configuration for an application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.parser().add_argument( "tracing_provider", type=str, required=True, location="args", help="Tracing provider name" ) ) - @api.response(204, "Tracing configuration deleted successfully") - @api.response(400, "Invalid request parameters or configuration not found") + @console_ns.response(204, "Tracing configuration deleted successfully") + @console_ns.response(400, "Invalid request parameters or configuration not found") @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/app/site.py b/api/controllers/console/app/site.py index b8edbf77c7..b2f1997620 100644 --- a/api/controllers/console/app/site.py +++ b/api/controllers/console/app/site.py @@ -2,7 +2,7 @@ from flask_restx import Resource, fields, marshal_with, reqparse from werkzeug.exceptions import NotFound from constants.languages import supported_language -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.app.wraps import get_app_model from controllers.console.wraps import ( account_initialization_required, @@ -48,11 +48,11 @@ def parse_app_site_args(): @console_ns.route("/apps//site") class AppSite(Resource): - @api.doc("update_app_site") - @api.doc(description="Update application site configuration") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.model( + @console_ns.doc("update_app_site") + @console_ns.doc(description="Update application site configuration") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.model( "AppSiteRequest", { "title": fields.String(description="Site title"), @@ -76,9 +76,9 @@ class AppSite(Resource): }, ) ) - @api.response(200, "Site configuration updated successfully", app_site_fields) - @api.response(403, "Insufficient permissions") - @api.response(404, "App not found") + @console_ns.response(200, "Site configuration updated successfully", app_site_fields) + @console_ns.response(403, "Insufficient permissions") + @console_ns.response(404, "App not found") @setup_required @login_required @edit_permission_required @@ -123,12 +123,12 @@ class AppSite(Resource): @console_ns.route("/apps//site/access-token-reset") class AppSiteAccessTokenReset(Resource): - @api.doc("reset_app_site_access_token") - @api.doc(description="Reset access token for application site") - @api.doc(params={"app_id": "Application ID"}) - @api.response(200, "Access token reset successfully", app_site_fields) - @api.response(403, "Insufficient permissions (admin/owner required)") - @api.response(404, "App or site not found") + @console_ns.doc("reset_app_site_access_token") + @console_ns.doc(description="Reset access token for application site") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.response(200, "Access token reset successfully", app_site_fields) + @console_ns.response(403, "Insufficient permissions (admin/owner required)") + @console_ns.response(404, "App or site not found") @setup_required @login_required @is_admin_or_owner_required diff --git a/api/controllers/console/app/statistic.py b/api/controllers/console/app/statistic.py index b4bd05e891..c8f54c638e 100644 --- a/api/controllers/console/app/statistic.py +++ b/api/controllers/console/app/statistic.py @@ -4,7 +4,7 @@ import sqlalchemy as sa from flask import abort, jsonify from flask_restx import Resource, fields, reqparse -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.app.wraps import get_app_model from controllers.console.wraps import account_initialization_required, setup_required from core.app.entities.app_invoke_entities import InvokeFrom @@ -17,15 +17,15 @@ from models import AppMode @console_ns.route("/apps//statistics/daily-messages") class DailyMessageStatistic(Resource): - @api.doc("get_daily_message_statistics") - @api.doc(description="Get daily message statistics for an application") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.parser() + @console_ns.doc("get_daily_message_statistics") + @console_ns.doc(description="Get daily message statistics for an application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.parser() .add_argument("start", type=str, location="args", help="Start date (YYYY-MM-DD HH:MM)") .add_argument("end", type=str, location="args", help="End date (YYYY-MM-DD HH:MM)") ) - @api.response( + @console_ns.response( 200, "Daily message statistics retrieved successfully", fields.List(fields.Raw(description="Daily message count data")), @@ -90,11 +90,11 @@ parser = ( @console_ns.route("/apps//statistics/daily-conversations") class DailyConversationStatistic(Resource): - @api.doc("get_daily_conversation_statistics") - @api.doc(description="Get daily conversation statistics for an application") - @api.doc(params={"app_id": "Application ID"}) - @api.expect(parser) - @api.response( + @console_ns.doc("get_daily_conversation_statistics") + @console_ns.doc(description="Get daily conversation statistics for an application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect(parser) + @console_ns.response( 200, "Daily conversation statistics retrieved successfully", fields.List(fields.Raw(description="Daily conversation count data")), @@ -146,11 +146,11 @@ WHERE @console_ns.route("/apps//statistics/daily-end-users") class DailyTerminalsStatistic(Resource): - @api.doc("get_daily_terminals_statistics") - @api.doc(description="Get daily terminal/end-user statistics for an application") - @api.doc(params={"app_id": "Application ID"}) - @api.expect(parser) - @api.response( + @console_ns.doc("get_daily_terminals_statistics") + @console_ns.doc(description="Get daily terminal/end-user statistics for an application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect(parser) + @console_ns.response( 200, "Daily terminal statistics retrieved successfully", fields.List(fields.Raw(description="Daily terminal count data")), @@ -203,11 +203,11 @@ WHERE @console_ns.route("/apps//statistics/token-costs") class DailyTokenCostStatistic(Resource): - @api.doc("get_daily_token_cost_statistics") - @api.doc(description="Get daily token cost statistics for an application") - @api.doc(params={"app_id": "Application ID"}) - @api.expect(parser) - @api.response( + @console_ns.doc("get_daily_token_cost_statistics") + @console_ns.doc(description="Get daily token cost statistics for an application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect(parser) + @console_ns.response( 200, "Daily token cost statistics retrieved successfully", fields.List(fields.Raw(description="Daily token cost data")), @@ -263,11 +263,11 @@ WHERE @console_ns.route("/apps//statistics/average-session-interactions") class AverageSessionInteractionStatistic(Resource): - @api.doc("get_average_session_interaction_statistics") - @api.doc(description="Get average session interaction statistics for an application") - @api.doc(params={"app_id": "Application ID"}) - @api.expect(parser) - @api.response( + @console_ns.doc("get_average_session_interaction_statistics") + @console_ns.doc(description="Get average session interaction statistics for an application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect(parser) + @console_ns.response( 200, "Average session interaction statistics retrieved successfully", fields.List(fields.Raw(description="Average session interaction data")), @@ -339,11 +339,11 @@ ORDER BY @console_ns.route("/apps//statistics/user-satisfaction-rate") class UserSatisfactionRateStatistic(Resource): - @api.doc("get_user_satisfaction_rate_statistics") - @api.doc(description="Get user satisfaction rate statistics for an application") - @api.doc(params={"app_id": "Application ID"}) - @api.expect(parser) - @api.response( + @console_ns.doc("get_user_satisfaction_rate_statistics") + @console_ns.doc(description="Get user satisfaction rate statistics for an application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect(parser) + @console_ns.response( 200, "User satisfaction rate statistics retrieved successfully", fields.List(fields.Raw(description="User satisfaction rate data")), @@ -405,11 +405,11 @@ WHERE @console_ns.route("/apps//statistics/average-response-time") class AverageResponseTimeStatistic(Resource): - @api.doc("get_average_response_time_statistics") - @api.doc(description="Get average response time statistics for an application") - @api.doc(params={"app_id": "Application ID"}) - @api.expect(parser) - @api.response( + @console_ns.doc("get_average_response_time_statistics") + @console_ns.doc(description="Get average response time statistics for an application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect(parser) + @console_ns.response( 200, "Average response time statistics retrieved successfully", fields.List(fields.Raw(description="Average response time data")), @@ -462,11 +462,11 @@ WHERE @console_ns.route("/apps//statistics/tokens-per-second") class TokensPerSecondStatistic(Resource): - @api.doc("get_tokens_per_second_statistics") - @api.doc(description="Get tokens per second statistics for an application") - @api.doc(params={"app_id": "Application ID"}) - @api.expect(parser) - @api.response( + @console_ns.doc("get_tokens_per_second_statistics") + @console_ns.doc(description="Get tokens per second statistics for an application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect(parser) + @console_ns.response( 200, "Tokens per second statistics retrieved successfully", fields.List(fields.Raw(description="Tokens per second data")), diff --git a/api/controllers/console/app/workflow.py b/api/controllers/console/app/workflow.py index 2f6808f11d..9b5a4e895c 100644 --- a/api/controllers/console/app/workflow.py +++ b/api/controllers/console/app/workflow.py @@ -9,7 +9,7 @@ from sqlalchemy.orm import Session from werkzeug.exceptions import Forbidden, InternalServerError, NotFound import services -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.app.error import ConversationCompletedError, DraftWorkflowNotExist, DraftWorkflowNotSync from controllers.console.app.wraps import get_app_model from controllers.console.wraps import account_initialization_required, edit_permission_required, setup_required @@ -70,11 +70,11 @@ def _parse_file(workflow: Workflow, files: list[dict] | None = None) -> Sequence @console_ns.route("/apps//workflows/draft") class DraftWorkflowApi(Resource): - @api.doc("get_draft_workflow") - @api.doc(description="Get draft workflow for an application") - @api.doc(params={"app_id": "Application ID"}) - @api.response(200, "Draft workflow retrieved successfully", workflow_fields) - @api.response(404, "Draft workflow not found") + @console_ns.doc("get_draft_workflow") + @console_ns.doc(description="Get draft workflow for an application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.response(200, "Draft workflow retrieved successfully", workflow_fields) + @console_ns.response(404, "Draft workflow not found") @setup_required @login_required @account_initialization_required @@ -99,10 +99,10 @@ class DraftWorkflowApi(Resource): @login_required @account_initialization_required @get_app_model(mode=[AppMode.ADVANCED_CHAT, AppMode.WORKFLOW]) - @api.doc("sync_draft_workflow") - @api.doc(description="Sync draft workflow configuration") - @api.expect( - api.model( + @console_ns.doc("sync_draft_workflow") + @console_ns.doc(description="Sync draft workflow configuration") + @console_ns.expect( + console_ns.model( "SyncDraftWorkflowRequest", { "graph": fields.Raw(required=True, description="Workflow graph configuration"), @@ -113,10 +113,10 @@ class DraftWorkflowApi(Resource): }, ) ) - @api.response( + @console_ns.response( 200, "Draft workflow synced successfully", - api.model( + console_ns.model( "SyncDraftWorkflowResponse", { "result": fields.String, @@ -125,8 +125,8 @@ class DraftWorkflowApi(Resource): }, ), ) - @api.response(400, "Invalid workflow configuration") - @api.response(403, "Permission denied") + @console_ns.response(400, "Invalid workflow configuration") + @console_ns.response(403, "Permission denied") @edit_permission_required def post(self, app_model: App): """ @@ -198,11 +198,11 @@ class DraftWorkflowApi(Resource): @console_ns.route("/apps//advanced-chat/workflows/draft/run") class AdvancedChatDraftWorkflowRunApi(Resource): - @api.doc("run_advanced_chat_draft_workflow") - @api.doc(description="Run draft workflow for advanced chat application") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.model( + @console_ns.doc("run_advanced_chat_draft_workflow") + @console_ns.doc(description="Run draft workflow for advanced chat application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.model( "AdvancedChatWorkflowRunRequest", { "query": fields.String(required=True, description="User query"), @@ -212,9 +212,9 @@ class AdvancedChatDraftWorkflowRunApi(Resource): }, ) ) - @api.response(200, "Workflow run started successfully") - @api.response(400, "Invalid request parameters") - @api.response(403, "Permission denied") + @console_ns.response(200, "Workflow run started successfully") + @console_ns.response(400, "Invalid request parameters") + @console_ns.response(403, "Permission denied") @setup_required @login_required @account_initialization_required @@ -262,11 +262,11 @@ class AdvancedChatDraftWorkflowRunApi(Resource): @console_ns.route("/apps//advanced-chat/workflows/draft/iteration/nodes//run") class AdvancedChatDraftRunIterationNodeApi(Resource): - @api.doc("run_advanced_chat_draft_iteration_node") - @api.doc(description="Run draft workflow iteration node for advanced chat") - @api.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) - @api.expect( - api.model( + @console_ns.doc("run_advanced_chat_draft_iteration_node") + @console_ns.doc(description="Run draft workflow iteration node for advanced chat") + @console_ns.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) + @console_ns.expect( + console_ns.model( "IterationNodeRunRequest", { "task_id": fields.String(required=True, description="Task ID"), @@ -274,9 +274,9 @@ class AdvancedChatDraftRunIterationNodeApi(Resource): }, ) ) - @api.response(200, "Iteration node run started successfully") - @api.response(403, "Permission denied") - @api.response(404, "Node not found") + @console_ns.response(200, "Iteration node run started successfully") + @console_ns.response(403, "Permission denied") + @console_ns.response(404, "Node not found") @setup_required @login_required @account_initialization_required @@ -309,11 +309,11 @@ class AdvancedChatDraftRunIterationNodeApi(Resource): @console_ns.route("/apps//workflows/draft/iteration/nodes//run") class WorkflowDraftRunIterationNodeApi(Resource): - @api.doc("run_workflow_draft_iteration_node") - @api.doc(description="Run draft workflow iteration node") - @api.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) - @api.expect( - api.model( + @console_ns.doc("run_workflow_draft_iteration_node") + @console_ns.doc(description="Run draft workflow iteration node") + @console_ns.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) + @console_ns.expect( + console_ns.model( "WorkflowIterationNodeRunRequest", { "task_id": fields.String(required=True, description="Task ID"), @@ -321,9 +321,9 @@ class WorkflowDraftRunIterationNodeApi(Resource): }, ) ) - @api.response(200, "Workflow iteration node run started successfully") - @api.response(403, "Permission denied") - @api.response(404, "Node not found") + @console_ns.response(200, "Workflow iteration node run started successfully") + @console_ns.response(403, "Permission denied") + @console_ns.response(404, "Node not found") @setup_required @login_required @account_initialization_required @@ -356,11 +356,11 @@ class WorkflowDraftRunIterationNodeApi(Resource): @console_ns.route("/apps//advanced-chat/workflows/draft/loop/nodes//run") class AdvancedChatDraftRunLoopNodeApi(Resource): - @api.doc("run_advanced_chat_draft_loop_node") - @api.doc(description="Run draft workflow loop node for advanced chat") - @api.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) - @api.expect( - api.model( + @console_ns.doc("run_advanced_chat_draft_loop_node") + @console_ns.doc(description="Run draft workflow loop node for advanced chat") + @console_ns.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) + @console_ns.expect( + console_ns.model( "LoopNodeRunRequest", { "task_id": fields.String(required=True, description="Task ID"), @@ -368,9 +368,9 @@ class AdvancedChatDraftRunLoopNodeApi(Resource): }, ) ) - @api.response(200, "Loop node run started successfully") - @api.response(403, "Permission denied") - @api.response(404, "Node not found") + @console_ns.response(200, "Loop node run started successfully") + @console_ns.response(403, "Permission denied") + @console_ns.response(404, "Node not found") @setup_required @login_required @account_initialization_required @@ -403,11 +403,11 @@ class AdvancedChatDraftRunLoopNodeApi(Resource): @console_ns.route("/apps//workflows/draft/loop/nodes//run") class WorkflowDraftRunLoopNodeApi(Resource): - @api.doc("run_workflow_draft_loop_node") - @api.doc(description="Run draft workflow loop node") - @api.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) - @api.expect( - api.model( + @console_ns.doc("run_workflow_draft_loop_node") + @console_ns.doc(description="Run draft workflow loop node") + @console_ns.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) + @console_ns.expect( + console_ns.model( "WorkflowLoopNodeRunRequest", { "task_id": fields.String(required=True, description="Task ID"), @@ -415,9 +415,9 @@ class WorkflowDraftRunLoopNodeApi(Resource): }, ) ) - @api.response(200, "Workflow loop node run started successfully") - @api.response(403, "Permission denied") - @api.response(404, "Node not found") + @console_ns.response(200, "Workflow loop node run started successfully") + @console_ns.response(403, "Permission denied") + @console_ns.response(404, "Node not found") @setup_required @login_required @account_initialization_required @@ -450,11 +450,11 @@ class WorkflowDraftRunLoopNodeApi(Resource): @console_ns.route("/apps//workflows/draft/run") class DraftWorkflowRunApi(Resource): - @api.doc("run_draft_workflow") - @api.doc(description="Run draft workflow") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.model( + @console_ns.doc("run_draft_workflow") + @console_ns.doc(description="Run draft workflow") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.model( "DraftWorkflowRunRequest", { "inputs": fields.Raw(required=True, description="Input variables"), @@ -462,8 +462,8 @@ class DraftWorkflowRunApi(Resource): }, ) ) - @api.response(200, "Draft workflow run started successfully") - @api.response(403, "Permission denied") + @console_ns.response(200, "Draft workflow run started successfully") + @console_ns.response(403, "Permission denied") @setup_required @login_required @account_initialization_required @@ -501,12 +501,12 @@ class DraftWorkflowRunApi(Resource): @console_ns.route("/apps//workflow-runs/tasks//stop") class WorkflowTaskStopApi(Resource): - @api.doc("stop_workflow_task") - @api.doc(description="Stop running workflow task") - @api.doc(params={"app_id": "Application ID", "task_id": "Task ID"}) - @api.response(200, "Task stopped successfully") - @api.response(404, "Task not found") - @api.response(403, "Permission denied") + @console_ns.doc("stop_workflow_task") + @console_ns.doc(description="Stop running workflow task") + @console_ns.doc(params={"app_id": "Application ID", "task_id": "Task ID"}) + @console_ns.response(200, "Task stopped successfully") + @console_ns.response(404, "Task not found") + @console_ns.response(403, "Permission denied") @setup_required @login_required @account_initialization_required @@ -528,20 +528,20 @@ class WorkflowTaskStopApi(Resource): @console_ns.route("/apps//workflows/draft/nodes//run") class DraftWorkflowNodeRunApi(Resource): - @api.doc("run_draft_workflow_node") - @api.doc(description="Run draft workflow node") - @api.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) - @api.expect( - api.model( + @console_ns.doc("run_draft_workflow_node") + @console_ns.doc(description="Run draft workflow node") + @console_ns.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) + @console_ns.expect( + console_ns.model( "DraftWorkflowNodeRunRequest", { "inputs": fields.Raw(description="Input variables"), }, ) ) - @api.response(200, "Node run started successfully", workflow_run_node_execution_fields) - @api.response(403, "Permission denied") - @api.response(404, "Node not found") + @console_ns.response(200, "Node run started successfully", workflow_run_node_execution_fields) + @console_ns.response(403, "Permission denied") + @console_ns.response(404, "Node not found") @setup_required @login_required @account_initialization_required @@ -595,11 +595,11 @@ parser_publish = ( @console_ns.route("/apps//workflows/publish") class PublishedWorkflowApi(Resource): - @api.doc("get_published_workflow") - @api.doc(description="Get published workflow for an application") - @api.doc(params={"app_id": "Application ID"}) - @api.response(200, "Published workflow retrieved successfully", workflow_fields) - @api.response(404, "Published workflow not found") + @console_ns.doc("get_published_workflow") + @console_ns.doc(description="Get published workflow for an application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.response(200, "Published workflow retrieved successfully", workflow_fields) + @console_ns.response(404, "Published workflow not found") @setup_required @login_required @account_initialization_required @@ -617,7 +617,7 @@ class PublishedWorkflowApi(Resource): # return workflow, if not found, return None return workflow - @api.expect(parser_publish) + @console_ns.expect(parser_publish) @setup_required @login_required @account_initialization_required @@ -666,10 +666,10 @@ class PublishedWorkflowApi(Resource): @console_ns.route("/apps//workflows/default-workflow-block-configs") class DefaultBlockConfigsApi(Resource): - @api.doc("get_default_block_configs") - @api.doc(description="Get default block configurations for workflow") - @api.doc(params={"app_id": "Application ID"}) - @api.response(200, "Default block configurations retrieved successfully") + @console_ns.doc("get_default_block_configs") + @console_ns.doc(description="Get default block configurations for workflow") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.response(200, "Default block configurations retrieved successfully") @setup_required @login_required @account_initialization_required @@ -689,12 +689,12 @@ parser_block = reqparse.RequestParser().add_argument("q", type=str, location="ar @console_ns.route("/apps//workflows/default-workflow-block-configs/") class DefaultBlockConfigApi(Resource): - @api.doc("get_default_block_config") - @api.doc(description="Get default block configuration by type") - @api.doc(params={"app_id": "Application ID", "block_type": "Block type"}) - @api.response(200, "Default block configuration retrieved successfully") - @api.response(404, "Block type not found") - @api.expect(parser_block) + @console_ns.doc("get_default_block_config") + @console_ns.doc(description="Get default block configuration by type") + @console_ns.doc(params={"app_id": "Application ID", "block_type": "Block type"}) + @console_ns.response(200, "Default block configuration retrieved successfully") + @console_ns.response(404, "Block type not found") + @console_ns.expect(parser_block) @setup_required @login_required @account_initialization_required @@ -731,13 +731,13 @@ parser_convert = ( @console_ns.route("/apps//convert-to-workflow") class ConvertToWorkflowApi(Resource): - @api.expect(parser_convert) - @api.doc("convert_to_workflow") - @api.doc(description="Convert application to workflow mode") - @api.doc(params={"app_id": "Application ID"}) - @api.response(200, "Application converted to workflow successfully") - @api.response(400, "Application cannot be converted") - @api.response(403, "Permission denied") + @console_ns.expect(parser_convert) + @console_ns.doc("convert_to_workflow") + @console_ns.doc(description="Convert application to workflow mode") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.response(200, "Application converted to workflow successfully") + @console_ns.response(400, "Application cannot be converted") + @console_ns.response(403, "Permission denied") @setup_required @login_required @account_initialization_required @@ -777,11 +777,11 @@ parser_workflows = ( @console_ns.route("/apps//workflows") class PublishedAllWorkflowApi(Resource): - @api.expect(parser_workflows) - @api.doc("get_all_published_workflows") - @api.doc(description="Get all published workflows for an application") - @api.doc(params={"app_id": "Application ID"}) - @api.response(200, "Published workflows retrieved successfully", workflow_pagination_fields) + @console_ns.expect(parser_workflows) + @console_ns.doc("get_all_published_workflows") + @console_ns.doc(description="Get all published workflows for an application") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.response(200, "Published workflows retrieved successfully", workflow_pagination_fields) @setup_required @login_required @account_initialization_required @@ -826,11 +826,11 @@ class PublishedAllWorkflowApi(Resource): @console_ns.route("/apps//workflows/") class WorkflowByIdApi(Resource): - @api.doc("update_workflow_by_id") - @api.doc(description="Update workflow by ID") - @api.doc(params={"app_id": "Application ID", "workflow_id": "Workflow ID"}) - @api.expect( - api.model( + @console_ns.doc("update_workflow_by_id") + @console_ns.doc(description="Update workflow by ID") + @console_ns.doc(params={"app_id": "Application ID", "workflow_id": "Workflow ID"}) + @console_ns.expect( + console_ns.model( "UpdateWorkflowRequest", { "environment_variables": fields.List(fields.Raw, description="Environment variables"), @@ -838,9 +838,9 @@ class WorkflowByIdApi(Resource): }, ) ) - @api.response(200, "Workflow updated successfully", workflow_fields) - @api.response(404, "Workflow not found") - @api.response(403, "Permission denied") + @console_ns.response(200, "Workflow updated successfully", workflow_fields) + @console_ns.response(404, "Workflow not found") + @console_ns.response(403, "Permission denied") @setup_required @login_required @account_initialization_required @@ -926,12 +926,12 @@ class WorkflowByIdApi(Resource): @console_ns.route("/apps//workflows/draft/nodes//last-run") class DraftWorkflowNodeLastRunApi(Resource): - @api.doc("get_draft_workflow_node_last_run") - @api.doc(description="Get last run result for draft workflow node") - @api.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) - @api.response(200, "Node last run retrieved successfully", workflow_run_node_execution_fields) - @api.response(404, "Node last run not found") - @api.response(403, "Permission denied") + @console_ns.doc("get_draft_workflow_node_last_run") + @console_ns.doc(description="Get last run result for draft workflow node") + @console_ns.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) + @console_ns.response(200, "Node last run retrieved successfully", workflow_run_node_execution_fields) + @console_ns.response(404, "Node last run not found") + @console_ns.response(403, "Permission denied") @setup_required @login_required @account_initialization_required @@ -959,20 +959,20 @@ class DraftWorkflowTriggerRunApi(Resource): Path: /apps//workflows/draft/trigger/run """ - @api.doc("poll_draft_workflow_trigger_run") - @api.doc(description="Poll for trigger events and execute full workflow when event arrives") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.model( + @console_ns.doc("poll_draft_workflow_trigger_run") + @console_ns.doc(description="Poll for trigger events and execute full workflow when event arrives") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.model( "DraftWorkflowTriggerRunRequest", { "node_id": fields.String(required=True, description="Node ID"), }, ) ) - @api.response(200, "Trigger event received and workflow executed successfully") - @api.response(403, "Permission denied") - @api.response(500, "Internal server error") + @console_ns.response(200, "Trigger event received and workflow executed successfully") + @console_ns.response(403, "Permission denied") + @console_ns.response(500, "Internal server error") @setup_required @login_required @account_initialization_required @@ -1033,12 +1033,12 @@ class DraftWorkflowTriggerNodeApi(Resource): Path: /apps//workflows/draft/nodes//trigger/run """ - @api.doc("poll_draft_workflow_trigger_node") - @api.doc(description="Poll for trigger events and execute single node when event arrives") - @api.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) - @api.response(200, "Trigger event received and node executed successfully") - @api.response(403, "Permission denied") - @api.response(500, "Internal server error") + @console_ns.doc("poll_draft_workflow_trigger_node") + @console_ns.doc(description="Poll for trigger events and execute single node when event arrives") + @console_ns.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) + @console_ns.response(200, "Trigger event received and node executed successfully") + @console_ns.response(403, "Permission denied") + @console_ns.response(500, "Internal server error") @setup_required @login_required @account_initialization_required @@ -1112,20 +1112,20 @@ class DraftWorkflowTriggerRunAllApi(Resource): Path: /apps//workflows/draft/trigger/run-all """ - @api.doc("draft_workflow_trigger_run_all") - @api.doc(description="Full workflow debug when the start node is a trigger") - @api.doc(params={"app_id": "Application ID"}) - @api.expect( - api.model( + @console_ns.doc("draft_workflow_trigger_run_all") + @console_ns.doc(description="Full workflow debug when the start node is a trigger") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.expect( + console_ns.model( "DraftWorkflowTriggerRunAllRequest", { "node_ids": fields.List(fields.String, required=True, description="Node IDs"), }, ) ) - @api.response(200, "Workflow executed successfully") - @api.response(403, "Permission denied") - @api.response(500, "Internal server error") + @console_ns.response(200, "Workflow executed successfully") + @console_ns.response(403, "Permission denied") + @console_ns.response(500, "Internal server error") @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/app/workflow_app_log.py b/api/controllers/console/app/workflow_app_log.py index d7ecc7c91b..fc1fa9cb13 100644 --- a/api/controllers/console/app/workflow_app_log.py +++ b/api/controllers/console/app/workflow_app_log.py @@ -3,7 +3,7 @@ from flask_restx import Resource, marshal_with, reqparse from flask_restx.inputs import int_range from sqlalchemy.orm import Session -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.app.wraps import get_app_model from controllers.console.wraps import account_initialization_required, setup_required from core.workflow.enums import WorkflowExecutionStatus @@ -17,10 +17,10 @@ from services.workflow_app_service import WorkflowAppService @console_ns.route("/apps//workflow-app-logs") class WorkflowAppLogApi(Resource): - @api.doc("get_workflow_app_logs") - @api.doc(description="Get workflow application execution logs") - @api.doc(params={"app_id": "Application ID"}) - @api.doc( + @console_ns.doc("get_workflow_app_logs") + @console_ns.doc(description="Get workflow application execution logs") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.doc( params={ "keyword": "Search keyword for filtering logs", "status": "Filter by execution status (succeeded, failed, stopped, partial-succeeded)", @@ -33,7 +33,7 @@ class WorkflowAppLogApi(Resource): "limit": "Number of items per page (1-100)", } ) - @api.response(200, "Workflow app logs retrieved successfully", workflow_app_log_pagination_fields) + @console_ns.response(200, "Workflow app logs retrieved successfully", workflow_app_log_pagination_fields) @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/app/workflow_draft_variable.py b/api/controllers/console/app/workflow_draft_variable.py index ca97d8520c..007061ae7a 100644 --- a/api/controllers/console/app/workflow_draft_variable.py +++ b/api/controllers/console/app/workflow_draft_variable.py @@ -7,7 +7,7 @@ from flask import Response from flask_restx import Resource, fields, inputs, marshal, marshal_with, reqparse from sqlalchemy.orm import Session -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.app.error import ( DraftWorkflowNotExist, ) @@ -170,12 +170,14 @@ def _api_prerequisite(f: Callable[P, R]): @console_ns.route("/apps//workflows/draft/variables") class WorkflowVariableCollectionApi(Resource): - @api.expect(_create_pagination_parser()) - @api.doc("get_workflow_variables") - @api.doc(description="Get draft workflow variables") - @api.doc(params={"app_id": "Application ID"}) - @api.doc(params={"page": "Page number (1-100000)", "limit": "Number of items per page (1-100)"}) - @api.response(200, "Workflow variables retrieved successfully", _WORKFLOW_DRAFT_VARIABLE_LIST_WITHOUT_VALUE_FIELDS) + @console_ns.expect(_create_pagination_parser()) + @console_ns.doc("get_workflow_variables") + @console_ns.doc(description="Get draft workflow variables") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.doc(params={"page": "Page number (1-100000)", "limit": "Number of items per page (1-100)"}) + @console_ns.response( + 200, "Workflow variables retrieved successfully", _WORKFLOW_DRAFT_VARIABLE_LIST_WITHOUT_VALUE_FIELDS + ) @_api_prerequisite @marshal_with(_WORKFLOW_DRAFT_VARIABLE_LIST_WITHOUT_VALUE_FIELDS) def get(self, app_model: App): @@ -204,9 +206,9 @@ class WorkflowVariableCollectionApi(Resource): return workflow_vars - @api.doc("delete_workflow_variables") - @api.doc(description="Delete all draft workflow variables") - @api.response(204, "Workflow variables deleted successfully") + @console_ns.doc("delete_workflow_variables") + @console_ns.doc(description="Delete all draft workflow variables") + @console_ns.response(204, "Workflow variables deleted successfully") @_api_prerequisite def delete(self, app_model: App): draft_var_srv = WorkflowDraftVariableService( @@ -237,10 +239,10 @@ def validate_node_id(node_id: str) -> NoReturn | None: @console_ns.route("/apps//workflows/draft/nodes//variables") class NodeVariableCollectionApi(Resource): - @api.doc("get_node_variables") - @api.doc(description="Get variables for a specific node") - @api.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) - @api.response(200, "Node variables retrieved successfully", _WORKFLOW_DRAFT_VARIABLE_LIST_FIELDS) + @console_ns.doc("get_node_variables") + @console_ns.doc(description="Get variables for a specific node") + @console_ns.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) + @console_ns.response(200, "Node variables retrieved successfully", _WORKFLOW_DRAFT_VARIABLE_LIST_FIELDS) @_api_prerequisite @marshal_with(_WORKFLOW_DRAFT_VARIABLE_LIST_FIELDS) def get(self, app_model: App, node_id: str): @@ -253,9 +255,9 @@ class NodeVariableCollectionApi(Resource): return node_vars - @api.doc("delete_node_variables") - @api.doc(description="Delete all variables for a specific node") - @api.response(204, "Node variables deleted successfully") + @console_ns.doc("delete_node_variables") + @console_ns.doc(description="Delete all variables for a specific node") + @console_ns.response(204, "Node variables deleted successfully") @_api_prerequisite def delete(self, app_model: App, node_id: str): validate_node_id(node_id) @@ -270,11 +272,11 @@ class VariableApi(Resource): _PATCH_NAME_FIELD = "name" _PATCH_VALUE_FIELD = "value" - @api.doc("get_variable") - @api.doc(description="Get a specific workflow variable") - @api.doc(params={"app_id": "Application ID", "variable_id": "Variable ID"}) - @api.response(200, "Variable retrieved successfully", _WORKFLOW_DRAFT_VARIABLE_FIELDS) - @api.response(404, "Variable not found") + @console_ns.doc("get_variable") + @console_ns.doc(description="Get a specific workflow variable") + @console_ns.doc(params={"app_id": "Application ID", "variable_id": "Variable ID"}) + @console_ns.response(200, "Variable retrieved successfully", _WORKFLOW_DRAFT_VARIABLE_FIELDS) + @console_ns.response(404, "Variable not found") @_api_prerequisite @marshal_with(_WORKFLOW_DRAFT_VARIABLE_FIELDS) def get(self, app_model: App, variable_id: str): @@ -288,10 +290,10 @@ class VariableApi(Resource): raise NotFoundError(description=f"variable not found, id={variable_id}") return variable - @api.doc("update_variable") - @api.doc(description="Update a workflow variable") - @api.expect( - api.model( + @console_ns.doc("update_variable") + @console_ns.doc(description="Update a workflow variable") + @console_ns.expect( + console_ns.model( "UpdateVariableRequest", { "name": fields.String(description="Variable name"), @@ -299,8 +301,8 @@ class VariableApi(Resource): }, ) ) - @api.response(200, "Variable updated successfully", _WORKFLOW_DRAFT_VARIABLE_FIELDS) - @api.response(404, "Variable not found") + @console_ns.response(200, "Variable updated successfully", _WORKFLOW_DRAFT_VARIABLE_FIELDS) + @console_ns.response(404, "Variable not found") @_api_prerequisite @marshal_with(_WORKFLOW_DRAFT_VARIABLE_FIELDS) def patch(self, app_model: App, variable_id: str): @@ -364,10 +366,10 @@ class VariableApi(Resource): db.session.commit() return variable - @api.doc("delete_variable") - @api.doc(description="Delete a workflow variable") - @api.response(204, "Variable deleted successfully") - @api.response(404, "Variable not found") + @console_ns.doc("delete_variable") + @console_ns.doc(description="Delete a workflow variable") + @console_ns.response(204, "Variable deleted successfully") + @console_ns.response(404, "Variable not found") @_api_prerequisite def delete(self, app_model: App, variable_id: str): draft_var_srv = WorkflowDraftVariableService( @@ -385,12 +387,12 @@ class VariableApi(Resource): @console_ns.route("/apps//workflows/draft/variables//reset") class VariableResetApi(Resource): - @api.doc("reset_variable") - @api.doc(description="Reset a workflow variable to its default value") - @api.doc(params={"app_id": "Application ID", "variable_id": "Variable ID"}) - @api.response(200, "Variable reset successfully", _WORKFLOW_DRAFT_VARIABLE_FIELDS) - @api.response(204, "Variable reset (no content)") - @api.response(404, "Variable not found") + @console_ns.doc("reset_variable") + @console_ns.doc(description="Reset a workflow variable to its default value") + @console_ns.doc(params={"app_id": "Application ID", "variable_id": "Variable ID"}) + @console_ns.response(200, "Variable reset successfully", _WORKFLOW_DRAFT_VARIABLE_FIELDS) + @console_ns.response(204, "Variable reset (no content)") + @console_ns.response(404, "Variable not found") @_api_prerequisite def put(self, app_model: App, variable_id: str): draft_var_srv = WorkflowDraftVariableService( @@ -433,11 +435,11 @@ def _get_variable_list(app_model: App, node_id) -> WorkflowDraftVariableList: @console_ns.route("/apps//workflows/draft/conversation-variables") class ConversationVariableCollectionApi(Resource): - @api.doc("get_conversation_variables") - @api.doc(description="Get conversation variables for workflow") - @api.doc(params={"app_id": "Application ID"}) - @api.response(200, "Conversation variables retrieved successfully", _WORKFLOW_DRAFT_VARIABLE_LIST_FIELDS) - @api.response(404, "Draft workflow not found") + @console_ns.doc("get_conversation_variables") + @console_ns.doc(description="Get conversation variables for workflow") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.response(200, "Conversation variables retrieved successfully", _WORKFLOW_DRAFT_VARIABLE_LIST_FIELDS) + @console_ns.response(404, "Draft workflow not found") @_api_prerequisite @marshal_with(_WORKFLOW_DRAFT_VARIABLE_LIST_FIELDS) def get(self, app_model: App): @@ -455,10 +457,10 @@ class ConversationVariableCollectionApi(Resource): @console_ns.route("/apps//workflows/draft/system-variables") class SystemVariableCollectionApi(Resource): - @api.doc("get_system_variables") - @api.doc(description="Get system variables for workflow") - @api.doc(params={"app_id": "Application ID"}) - @api.response(200, "System variables retrieved successfully", _WORKFLOW_DRAFT_VARIABLE_LIST_FIELDS) + @console_ns.doc("get_system_variables") + @console_ns.doc(description="Get system variables for workflow") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.response(200, "System variables retrieved successfully", _WORKFLOW_DRAFT_VARIABLE_LIST_FIELDS) @_api_prerequisite @marshal_with(_WORKFLOW_DRAFT_VARIABLE_LIST_FIELDS) def get(self, app_model: App): @@ -467,11 +469,11 @@ class SystemVariableCollectionApi(Resource): @console_ns.route("/apps//workflows/draft/environment-variables") class EnvironmentVariableCollectionApi(Resource): - @api.doc("get_environment_variables") - @api.doc(description="Get environment variables for workflow") - @api.doc(params={"app_id": "Application ID"}) - @api.response(200, "Environment variables retrieved successfully") - @api.response(404, "Draft workflow not found") + @console_ns.doc("get_environment_variables") + @console_ns.doc(description="Get environment variables for workflow") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.response(200, "Environment variables retrieved successfully") + @console_ns.response(404, "Draft workflow not found") @_api_prerequisite def get(self, app_model: App): """ diff --git a/api/controllers/console/app/workflow_run.py b/api/controllers/console/app/workflow_run.py index 23c228efbe..51f7445ce0 100644 --- a/api/controllers/console/app/workflow_run.py +++ b/api/controllers/console/app/workflow_run.py @@ -3,7 +3,7 @@ from typing import cast from flask_restx import Resource, marshal_with, reqparse from flask_restx.inputs import int_range -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.app.wraps import get_app_model from controllers.console.wraps import account_initialization_required, setup_required from fields.workflow_run_fields import ( @@ -90,13 +90,17 @@ def _parse_workflow_run_count_args(): @console_ns.route("/apps//advanced-chat/workflow-runs") class AdvancedChatAppWorkflowRunListApi(Resource): - @api.doc("get_advanced_chat_workflow_runs") - @api.doc(description="Get advanced chat workflow run list") - @api.doc(params={"app_id": "Application ID"}) - @api.doc(params={"last_id": "Last run ID for pagination", "limit": "Number of items per page (1-100)"}) - @api.doc(params={"status": "Filter by status (optional): running, succeeded, failed, stopped, partial-succeeded"}) - @api.doc(params={"triggered_from": "Filter by trigger source (optional): debugging or app-run. Default: debugging"}) - @api.response(200, "Workflow runs retrieved successfully", advanced_chat_workflow_run_pagination_fields) + @console_ns.doc("get_advanced_chat_workflow_runs") + @console_ns.doc(description="Get advanced chat workflow run list") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.doc(params={"last_id": "Last run ID for pagination", "limit": "Number of items per page (1-100)"}) + @console_ns.doc( + params={"status": "Filter by status (optional): running, succeeded, failed, stopped, partial-succeeded"} + ) + @console_ns.doc( + params={"triggered_from": "Filter by trigger source (optional): debugging or app-run. Default: debugging"} + ) + @console_ns.response(200, "Workflow runs retrieved successfully", advanced_chat_workflow_run_pagination_fields) @setup_required @login_required @account_initialization_required @@ -125,11 +129,13 @@ class AdvancedChatAppWorkflowRunListApi(Resource): @console_ns.route("/apps//advanced-chat/workflow-runs/count") class AdvancedChatAppWorkflowRunCountApi(Resource): - @api.doc("get_advanced_chat_workflow_runs_count") - @api.doc(description="Get advanced chat workflow runs count statistics") - @api.doc(params={"app_id": "Application ID"}) - @api.doc(params={"status": "Filter by status (optional): running, succeeded, failed, stopped, partial-succeeded"}) - @api.doc( + @console_ns.doc("get_advanced_chat_workflow_runs_count") + @console_ns.doc(description="Get advanced chat workflow runs count statistics") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.doc( + params={"status": "Filter by status (optional): running, succeeded, failed, stopped, partial-succeeded"} + ) + @console_ns.doc( params={ "time_range": ( "Filter by time range (optional): e.g., 7d (7 days), 4h (4 hours), " @@ -137,8 +143,10 @@ class AdvancedChatAppWorkflowRunCountApi(Resource): ) } ) - @api.doc(params={"triggered_from": "Filter by trigger source (optional): debugging or app-run. Default: debugging"}) - @api.response(200, "Workflow runs count retrieved successfully", workflow_run_count_fields) + @console_ns.doc( + params={"triggered_from": "Filter by trigger source (optional): debugging or app-run. Default: debugging"} + ) + @console_ns.response(200, "Workflow runs count retrieved successfully", workflow_run_count_fields) @setup_required @login_required @account_initialization_required @@ -170,13 +178,17 @@ class AdvancedChatAppWorkflowRunCountApi(Resource): @console_ns.route("/apps//workflow-runs") class WorkflowRunListApi(Resource): - @api.doc("get_workflow_runs") - @api.doc(description="Get workflow run list") - @api.doc(params={"app_id": "Application ID"}) - @api.doc(params={"last_id": "Last run ID for pagination", "limit": "Number of items per page (1-100)"}) - @api.doc(params={"status": "Filter by status (optional): running, succeeded, failed, stopped, partial-succeeded"}) - @api.doc(params={"triggered_from": "Filter by trigger source (optional): debugging or app-run. Default: debugging"}) - @api.response(200, "Workflow runs retrieved successfully", workflow_run_pagination_fields) + @console_ns.doc("get_workflow_runs") + @console_ns.doc(description="Get workflow run list") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.doc(params={"last_id": "Last run ID for pagination", "limit": "Number of items per page (1-100)"}) + @console_ns.doc( + params={"status": "Filter by status (optional): running, succeeded, failed, stopped, partial-succeeded"} + ) + @console_ns.doc( + params={"triggered_from": "Filter by trigger source (optional): debugging or app-run. Default: debugging"} + ) + @console_ns.response(200, "Workflow runs retrieved successfully", workflow_run_pagination_fields) @setup_required @login_required @account_initialization_required @@ -205,11 +217,13 @@ class WorkflowRunListApi(Resource): @console_ns.route("/apps//workflow-runs/count") class WorkflowRunCountApi(Resource): - @api.doc("get_workflow_runs_count") - @api.doc(description="Get workflow runs count statistics") - @api.doc(params={"app_id": "Application ID"}) - @api.doc(params={"status": "Filter by status (optional): running, succeeded, failed, stopped, partial-succeeded"}) - @api.doc( + @console_ns.doc("get_workflow_runs_count") + @console_ns.doc(description="Get workflow runs count statistics") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.doc( + params={"status": "Filter by status (optional): running, succeeded, failed, stopped, partial-succeeded"} + ) + @console_ns.doc( params={ "time_range": ( "Filter by time range (optional): e.g., 7d (7 days), 4h (4 hours), " @@ -217,8 +231,10 @@ class WorkflowRunCountApi(Resource): ) } ) - @api.doc(params={"triggered_from": "Filter by trigger source (optional): debugging or app-run. Default: debugging"}) - @api.response(200, "Workflow runs count retrieved successfully", workflow_run_count_fields) + @console_ns.doc( + params={"triggered_from": "Filter by trigger source (optional): debugging or app-run. Default: debugging"} + ) + @console_ns.response(200, "Workflow runs count retrieved successfully", workflow_run_count_fields) @setup_required @login_required @account_initialization_required @@ -250,11 +266,11 @@ class WorkflowRunCountApi(Resource): @console_ns.route("/apps//workflow-runs/") class WorkflowRunDetailApi(Resource): - @api.doc("get_workflow_run_detail") - @api.doc(description="Get workflow run detail") - @api.doc(params={"app_id": "Application ID", "run_id": "Workflow run ID"}) - @api.response(200, "Workflow run detail retrieved successfully", workflow_run_detail_fields) - @api.response(404, "Workflow run not found") + @console_ns.doc("get_workflow_run_detail") + @console_ns.doc(description="Get workflow run detail") + @console_ns.doc(params={"app_id": "Application ID", "run_id": "Workflow run ID"}) + @console_ns.response(200, "Workflow run detail retrieved successfully", workflow_run_detail_fields) + @console_ns.response(404, "Workflow run not found") @setup_required @login_required @account_initialization_required @@ -274,11 +290,11 @@ class WorkflowRunDetailApi(Resource): @console_ns.route("/apps//workflow-runs//node-executions") class WorkflowRunNodeExecutionListApi(Resource): - @api.doc("get_workflow_run_node_executions") - @api.doc(description="Get workflow run node execution list") - @api.doc(params={"app_id": "Application ID", "run_id": "Workflow run ID"}) - @api.response(200, "Node executions retrieved successfully", workflow_run_node_execution_list_fields) - @api.response(404, "Workflow run not found") + @console_ns.doc("get_workflow_run_node_executions") + @console_ns.doc(description="Get workflow run node execution list") + @console_ns.doc(params={"app_id": "Application ID", "run_id": "Workflow run ID"}) + @console_ns.response(200, "Node executions retrieved successfully", workflow_run_node_execution_list_fields) + @console_ns.response(404, "Workflow run not found") @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/app/workflow_statistic.py b/api/controllers/console/app/workflow_statistic.py index ef5205c1ee..4a873e5ec1 100644 --- a/api/controllers/console/app/workflow_statistic.py +++ b/api/controllers/console/app/workflow_statistic.py @@ -2,7 +2,7 @@ from flask import abort, jsonify from flask_restx import Resource, reqparse from sqlalchemy.orm import sessionmaker -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.app.wraps import get_app_model from controllers.console.wraps import account_initialization_required, setup_required from extensions.ext_database import db @@ -21,11 +21,13 @@ class WorkflowDailyRunsStatistic(Resource): session_maker = sessionmaker(bind=db.engine, expire_on_commit=False) self._workflow_run_repo = DifyAPIRepositoryFactory.create_api_workflow_run_repository(session_maker) - @api.doc("get_workflow_daily_runs_statistic") - @api.doc(description="Get workflow daily runs statistics") - @api.doc(params={"app_id": "Application ID"}) - @api.doc(params={"start": "Start date and time (YYYY-MM-DD HH:MM)", "end": "End date and time (YYYY-MM-DD HH:MM)"}) - @api.response(200, "Daily runs statistics retrieved successfully") + @console_ns.doc("get_workflow_daily_runs_statistic") + @console_ns.doc(description="Get workflow daily runs statistics") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.doc( + params={"start": "Start date and time (YYYY-MM-DD HH:MM)", "end": "End date and time (YYYY-MM-DD HH:MM)"} + ) + @console_ns.response(200, "Daily runs statistics retrieved successfully") @get_app_model @setup_required @login_required @@ -66,11 +68,13 @@ class WorkflowDailyTerminalsStatistic(Resource): session_maker = sessionmaker(bind=db.engine, expire_on_commit=False) self._workflow_run_repo = DifyAPIRepositoryFactory.create_api_workflow_run_repository(session_maker) - @api.doc("get_workflow_daily_terminals_statistic") - @api.doc(description="Get workflow daily terminals statistics") - @api.doc(params={"app_id": "Application ID"}) - @api.doc(params={"start": "Start date and time (YYYY-MM-DD HH:MM)", "end": "End date and time (YYYY-MM-DD HH:MM)"}) - @api.response(200, "Daily terminals statistics retrieved successfully") + @console_ns.doc("get_workflow_daily_terminals_statistic") + @console_ns.doc(description="Get workflow daily terminals statistics") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.doc( + params={"start": "Start date and time (YYYY-MM-DD HH:MM)", "end": "End date and time (YYYY-MM-DD HH:MM)"} + ) + @console_ns.response(200, "Daily terminals statistics retrieved successfully") @get_app_model @setup_required @login_required @@ -111,11 +115,13 @@ class WorkflowDailyTokenCostStatistic(Resource): session_maker = sessionmaker(bind=db.engine, expire_on_commit=False) self._workflow_run_repo = DifyAPIRepositoryFactory.create_api_workflow_run_repository(session_maker) - @api.doc("get_workflow_daily_token_cost_statistic") - @api.doc(description="Get workflow daily token cost statistics") - @api.doc(params={"app_id": "Application ID"}) - @api.doc(params={"start": "Start date and time (YYYY-MM-DD HH:MM)", "end": "End date and time (YYYY-MM-DD HH:MM)"}) - @api.response(200, "Daily token cost statistics retrieved successfully") + @console_ns.doc("get_workflow_daily_token_cost_statistic") + @console_ns.doc(description="Get workflow daily token cost statistics") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.doc( + params={"start": "Start date and time (YYYY-MM-DD HH:MM)", "end": "End date and time (YYYY-MM-DD HH:MM)"} + ) + @console_ns.response(200, "Daily token cost statistics retrieved successfully") @get_app_model @setup_required @login_required @@ -156,11 +162,13 @@ class WorkflowAverageAppInteractionStatistic(Resource): session_maker = sessionmaker(bind=db.engine, expire_on_commit=False) self._workflow_run_repo = DifyAPIRepositoryFactory.create_api_workflow_run_repository(session_maker) - @api.doc("get_workflow_average_app_interaction_statistic") - @api.doc(description="Get workflow average app interaction statistics") - @api.doc(params={"app_id": "Application ID"}) - @api.doc(params={"start": "Start date and time (YYYY-MM-DD HH:MM)", "end": "End date and time (YYYY-MM-DD HH:MM)"}) - @api.response(200, "Average app interaction statistics retrieved successfully") + @console_ns.doc("get_workflow_average_app_interaction_statistic") + @console_ns.doc(description="Get workflow average app interaction statistics") + @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.doc( + params={"start": "Start date and time (YYYY-MM-DD HH:MM)", "end": "End date and time (YYYY-MM-DD HH:MM)"} + ) + @console_ns.response(200, "Average app interaction statistics retrieved successfully") @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/app/workflow_trigger.py b/api/controllers/console/app/workflow_trigger.py index 785813c5f0..c3ea60ae3a 100644 --- a/api/controllers/console/app/workflow_trigger.py +++ b/api/controllers/console/app/workflow_trigger.py @@ -6,7 +6,7 @@ from sqlalchemy.orm import Session from werkzeug.exceptions import NotFound from configs import dify_config -from controllers.console import api +from controllers.console import console_ns from controllers.console.app.wraps import get_app_model from controllers.console.wraps import account_initialization_required, edit_permission_required, setup_required from extensions.ext_database import db @@ -139,6 +139,6 @@ class AppTriggerEnableApi(Resource): return trigger -api.add_resource(WebhookTriggerApi, "/apps//workflows/triggers/webhook") -api.add_resource(AppTriggersApi, "/apps//triggers") -api.add_resource(AppTriggerEnableApi, "/apps//trigger-enable") +console_ns.add_resource(WebhookTriggerApi, "/apps//workflows/triggers/webhook") +console_ns.add_resource(AppTriggersApi, "/apps//triggers") +console_ns.add_resource(AppTriggerEnableApi, "/apps//trigger-enable") diff --git a/api/controllers/console/auth/activate.py b/api/controllers/console/auth/activate.py index 2eeef079a1..a11b741040 100644 --- a/api/controllers/console/auth/activate.py +++ b/api/controllers/console/auth/activate.py @@ -2,7 +2,7 @@ from flask import request from flask_restx import Resource, fields, reqparse from constants.languages import supported_language -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.error import AlreadyActivateError from extensions.ext_database import db from libs.datetime_utils import naive_utc_now @@ -20,13 +20,13 @@ active_check_parser = ( @console_ns.route("/activate/check") class ActivateCheckApi(Resource): - @api.doc("check_activation_token") - @api.doc(description="Check if activation token is valid") - @api.expect(active_check_parser) - @api.response( + @console_ns.doc("check_activation_token") + @console_ns.doc(description="Check if activation token is valid") + @console_ns.expect(active_check_parser) + @console_ns.response( 200, "Success", - api.model( + console_ns.model( "ActivationCheckResponse", { "is_valid": fields.Boolean(description="Whether token is valid"), @@ -69,13 +69,13 @@ active_parser = ( @console_ns.route("/activate") class ActivateApi(Resource): - @api.doc("activate_account") - @api.doc(description="Activate account with invitation token") - @api.expect(active_parser) - @api.response( + @console_ns.doc("activate_account") + @console_ns.doc(description="Activate account with invitation token") + @console_ns.expect(active_parser) + @console_ns.response( 200, "Account activated successfully", - api.model( + console_ns.model( "ActivationResponse", { "result": fields.String(description="Operation result"), @@ -83,7 +83,7 @@ class ActivateApi(Resource): }, ), ) - @api.response(400, "Already activated or invalid token") + @console_ns.response(400, "Already activated or invalid token") def post(self): args = active_parser.parse_args() diff --git a/api/controllers/console/auth/data_source_oauth.py b/api/controllers/console/auth/data_source_oauth.py index a27932ccd8..cd547caf20 100644 --- a/api/controllers/console/auth/data_source_oauth.py +++ b/api/controllers/console/auth/data_source_oauth.py @@ -5,7 +5,7 @@ from flask import current_app, redirect, request from flask_restx import Resource, fields from configs import dify_config -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.wraps import is_admin_or_owner_required from libs.login import login_required from libs.oauth_data_source import NotionOAuth @@ -29,19 +29,19 @@ def get_oauth_providers(): @console_ns.route("/oauth/data-source/") class OAuthDataSource(Resource): - @api.doc("oauth_data_source") - @api.doc(description="Get OAuth authorization URL for data source provider") - @api.doc(params={"provider": "Data source provider name (notion)"}) - @api.response( + @console_ns.doc("oauth_data_source") + @console_ns.doc(description="Get OAuth authorization URL for data source provider") + @console_ns.doc(params={"provider": "Data source provider name (notion)"}) + @console_ns.response( 200, "Authorization URL or internal setup success", - api.model( + console_ns.model( "OAuthDataSourceResponse", {"data": fields.Raw(description="Authorization URL or 'internal' for internal setup")}, ), ) - @api.response(400, "Invalid provider") - @api.response(403, "Admin privileges required") + @console_ns.response(400, "Invalid provider") + @console_ns.response(403, "Admin privileges required") @is_admin_or_owner_required def get(self, provider: str): # The role of the current user in the table must be admin or owner @@ -63,17 +63,17 @@ class OAuthDataSource(Resource): @console_ns.route("/oauth/data-source/callback/") class OAuthDataSourceCallback(Resource): - @api.doc("oauth_data_source_callback") - @api.doc(description="Handle OAuth callback from data source provider") - @api.doc( + @console_ns.doc("oauth_data_source_callback") + @console_ns.doc(description="Handle OAuth callback from data source provider") + @console_ns.doc( params={ "provider": "Data source provider name (notion)", "code": "Authorization code from OAuth provider", "error": "Error message from OAuth provider", } ) - @api.response(302, "Redirect to console with result") - @api.response(400, "Invalid provider") + @console_ns.response(302, "Redirect to console with result") + @console_ns.response(400, "Invalid provider") def get(self, provider: str): OAUTH_DATASOURCE_PROVIDERS = get_oauth_providers() with current_app.app_context(): @@ -94,17 +94,17 @@ class OAuthDataSourceCallback(Resource): @console_ns.route("/oauth/data-source/binding/") class OAuthDataSourceBinding(Resource): - @api.doc("oauth_data_source_binding") - @api.doc(description="Bind OAuth data source with authorization code") - @api.doc( + @console_ns.doc("oauth_data_source_binding") + @console_ns.doc(description="Bind OAuth data source with authorization code") + @console_ns.doc( params={"provider": "Data source provider name (notion)", "code": "Authorization code from OAuth provider"} ) - @api.response( + @console_ns.response( 200, "Data source binding success", - api.model("OAuthDataSourceBindingResponse", {"result": fields.String(description="Operation result")}), + console_ns.model("OAuthDataSourceBindingResponse", {"result": fields.String(description="Operation result")}), ) - @api.response(400, "Invalid provider or code") + @console_ns.response(400, "Invalid provider or code") def get(self, provider: str): OAUTH_DATASOURCE_PROVIDERS = get_oauth_providers() with current_app.app_context(): @@ -128,15 +128,15 @@ class OAuthDataSourceBinding(Resource): @console_ns.route("/oauth/data-source///sync") class OAuthDataSourceSync(Resource): - @api.doc("oauth_data_source_sync") - @api.doc(description="Sync data from OAuth data source") - @api.doc(params={"provider": "Data source provider name (notion)", "binding_id": "Data source binding ID"}) - @api.response( + @console_ns.doc("oauth_data_source_sync") + @console_ns.doc(description="Sync data from OAuth data source") + @console_ns.doc(params={"provider": "Data source provider name (notion)", "binding_id": "Data source binding ID"}) + @console_ns.response( 200, "Data source sync success", - api.model("OAuthDataSourceSyncResponse", {"result": fields.String(description="Operation result")}), + console_ns.model("OAuthDataSourceSyncResponse", {"result": fields.String(description="Operation result")}), ) - @api.response(400, "Invalid provider or sync failed") + @console_ns.response(400, "Invalid provider or sync failed") @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/auth/forgot_password.py b/api/controllers/console/auth/forgot_password.py index 6be6ad51fe..ee561bdd30 100644 --- a/api/controllers/console/auth/forgot_password.py +++ b/api/controllers/console/auth/forgot_password.py @@ -6,7 +6,7 @@ from flask_restx import Resource, fields, reqparse from sqlalchemy import select from sqlalchemy.orm import Session -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.auth.error import ( EmailCodeError, EmailPasswordResetLimitError, @@ -27,10 +27,10 @@ from services.feature_service import FeatureService @console_ns.route("/forgot-password") class ForgotPasswordSendEmailApi(Resource): - @api.doc("send_forgot_password_email") - @api.doc(description="Send password reset email") - @api.expect( - api.model( + @console_ns.doc("send_forgot_password_email") + @console_ns.doc(description="Send password reset email") + @console_ns.expect( + console_ns.model( "ForgotPasswordEmailRequest", { "email": fields.String(required=True, description="Email address"), @@ -38,10 +38,10 @@ class ForgotPasswordSendEmailApi(Resource): }, ) ) - @api.response( + @console_ns.response( 200, "Email sent successfully", - api.model( + console_ns.model( "ForgotPasswordEmailResponse", { "result": fields.String(description="Operation result"), @@ -50,7 +50,7 @@ class ForgotPasswordSendEmailApi(Resource): }, ), ) - @api.response(400, "Invalid email or rate limit exceeded") + @console_ns.response(400, "Invalid email or rate limit exceeded") @setup_required @email_password_login_enabled def post(self): @@ -85,10 +85,10 @@ class ForgotPasswordSendEmailApi(Resource): @console_ns.route("/forgot-password/validity") class ForgotPasswordCheckApi(Resource): - @api.doc("check_forgot_password_code") - @api.doc(description="Verify password reset code") - @api.expect( - api.model( + @console_ns.doc("check_forgot_password_code") + @console_ns.doc(description="Verify password reset code") + @console_ns.expect( + console_ns.model( "ForgotPasswordCheckRequest", { "email": fields.String(required=True, description="Email address"), @@ -97,10 +97,10 @@ class ForgotPasswordCheckApi(Resource): }, ) ) - @api.response( + @console_ns.response( 200, "Code verified successfully", - api.model( + console_ns.model( "ForgotPasswordCheckResponse", { "is_valid": fields.Boolean(description="Whether code is valid"), @@ -109,7 +109,7 @@ class ForgotPasswordCheckApi(Resource): }, ), ) - @api.response(400, "Invalid code or token") + @console_ns.response(400, "Invalid code or token") @setup_required @email_password_login_enabled def post(self): @@ -152,10 +152,10 @@ class ForgotPasswordCheckApi(Resource): @console_ns.route("/forgot-password/resets") class ForgotPasswordResetApi(Resource): - @api.doc("reset_password") - @api.doc(description="Reset password with verification token") - @api.expect( - api.model( + @console_ns.doc("reset_password") + @console_ns.doc(description="Reset password with verification token") + @console_ns.expect( + console_ns.model( "ForgotPasswordResetRequest", { "token": fields.String(required=True, description="Verification token"), @@ -164,12 +164,12 @@ class ForgotPasswordResetApi(Resource): }, ) ) - @api.response( + @console_ns.response( 200, "Password reset successfully", - api.model("ForgotPasswordResetResponse", {"result": fields.String(description="Operation result")}), + console_ns.model("ForgotPasswordResetResponse", {"result": fields.String(description="Operation result")}), ) - @api.response(400, "Invalid token or password mismatch") + @console_ns.response(400, "Invalid token or password mismatch") @setup_required @email_password_login_enabled def post(self): diff --git a/api/controllers/console/auth/oauth.py b/api/controllers/console/auth/oauth.py index 29653b32ec..7ad1e56373 100644 --- a/api/controllers/console/auth/oauth.py +++ b/api/controllers/console/auth/oauth.py @@ -26,7 +26,7 @@ from services.errors.account import AccountNotFoundError, AccountRegisterError from services.errors.workspace import WorkSpaceNotAllowedCreateError, WorkSpaceNotFoundError from services.feature_service import FeatureService -from .. import api, console_ns +from .. import console_ns logger = logging.getLogger(__name__) @@ -56,11 +56,13 @@ def get_oauth_providers(): @console_ns.route("/oauth/login/") class OAuthLogin(Resource): - @api.doc("oauth_login") - @api.doc(description="Initiate OAuth login process") - @api.doc(params={"provider": "OAuth provider name (github/google)", "invite_token": "Optional invitation token"}) - @api.response(302, "Redirect to OAuth authorization URL") - @api.response(400, "Invalid provider") + @console_ns.doc("oauth_login") + @console_ns.doc(description="Initiate OAuth login process") + @console_ns.doc( + params={"provider": "OAuth provider name (github/google)", "invite_token": "Optional invitation token"} + ) + @console_ns.response(302, "Redirect to OAuth authorization URL") + @console_ns.response(400, "Invalid provider") def get(self, provider: str): invite_token = request.args.get("invite_token") or None OAUTH_PROVIDERS = get_oauth_providers() @@ -75,17 +77,17 @@ class OAuthLogin(Resource): @console_ns.route("/oauth/authorize/") class OAuthCallback(Resource): - @api.doc("oauth_callback") - @api.doc(description="Handle OAuth callback and complete login process") - @api.doc( + @console_ns.doc("oauth_callback") + @console_ns.doc(description="Handle OAuth callback and complete login process") + @console_ns.doc( params={ "provider": "OAuth provider name (github/google)", "code": "Authorization code from OAuth provider", "state": "Optional state parameter (used for invite token)", } ) - @api.response(302, "Redirect to console with access token") - @api.response(400, "OAuth process failed") + @console_ns.response(302, "Redirect to console with access token") + @console_ns.response(400, "OAuth process failed") def get(self, provider: str): OAUTH_PROVIDERS = get_oauth_providers() with current_app.app_context(): diff --git a/api/controllers/console/billing/billing.py b/api/controllers/console/billing/billing.py index 6efb4564ca..4fef1ba40d 100644 --- a/api/controllers/console/billing/billing.py +++ b/api/controllers/console/billing/billing.py @@ -3,7 +3,7 @@ import base64 from flask_restx import Resource, fields, reqparse from werkzeug.exceptions import BadRequest -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.wraps import account_initialization_required, only_edition_cloud, setup_required from enums.cloud_plan import CloudPlan from libs.login import current_account_with_tenant, login_required @@ -48,17 +48,17 @@ class Invoices(Resource): @console_ns.route("/billing/partners//tenants") class PartnerTenants(Resource): - @api.doc("sync_partner_tenants_bindings") - @api.doc(description="Sync partner tenants bindings") - @api.doc(params={"partner_key": "Partner key"}) - @api.expect( - api.model( + @console_ns.doc("sync_partner_tenants_bindings") + @console_ns.doc(description="Sync partner tenants bindings") + @console_ns.doc(params={"partner_key": "Partner key"}) + @console_ns.expect( + console_ns.model( "SyncPartnerTenantsBindingsRequest", {"click_id": fields.String(required=True, description="Click Id from partner referral link")}, ) ) - @api.response(200, "Tenants synced to partner successfully") - @api.response(400, "Invalid partner information") + @console_ns.response(200, "Tenants synced to partner successfully") + @console_ns.response(400, "Invalid partner information") @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/datasets/datasets.py b/api/controllers/console/datasets/datasets.py index 3aac571300..54761413f4 100644 --- a/api/controllers/console/datasets/datasets.py +++ b/api/controllers/console/datasets/datasets.py @@ -7,7 +7,7 @@ from werkzeug.exceptions import Forbidden, NotFound import services from configs import dify_config -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.apikey import api_key_fields, api_key_list from controllers.console.app.error import ProviderNotInitializeError from controllers.console.datasets.error import DatasetInUseError, DatasetNameDuplicateError, IndexingEstimateError @@ -119,9 +119,9 @@ def _get_retrieval_methods_by_vector_type(vector_type: str | None, is_mock: bool @console_ns.route("/datasets") class DatasetListApi(Resource): - @api.doc("get_datasets") - @api.doc(description="Get list of datasets") - @api.doc( + @console_ns.doc("get_datasets") + @console_ns.doc(description="Get list of datasets") + @console_ns.doc( params={ "page": "Page number (default: 1)", "limit": "Number of items per page (default: 20)", @@ -131,7 +131,7 @@ class DatasetListApi(Resource): "include_all": "Include all datasets (default: false)", } ) - @api.response(200, "Datasets retrieved successfully") + @console_ns.response(200, "Datasets retrieved successfully") @setup_required @login_required @account_initialization_required @@ -184,10 +184,10 @@ class DatasetListApi(Resource): response = {"data": data, "has_more": len(datasets) == limit, "limit": limit, "total": total, "page": page} return response, 200 - @api.doc("create_dataset") - @api.doc(description="Create a new dataset") - @api.expect( - api.model( + @console_ns.doc("create_dataset") + @console_ns.doc(description="Create a new dataset") + @console_ns.expect( + console_ns.model( "CreateDatasetRequest", { "name": fields.String(required=True, description="Dataset name (1-40 characters)"), @@ -200,8 +200,8 @@ class DatasetListApi(Resource): }, ) ) - @api.response(201, "Dataset created successfully") - @api.response(400, "Invalid request parameters") + @console_ns.response(201, "Dataset created successfully") + @console_ns.response(400, "Invalid request parameters") @setup_required @login_required @account_initialization_required @@ -279,12 +279,12 @@ class DatasetListApi(Resource): @console_ns.route("/datasets/") class DatasetApi(Resource): - @api.doc("get_dataset") - @api.doc(description="Get dataset details") - @api.doc(params={"dataset_id": "Dataset ID"}) - @api.response(200, "Dataset retrieved successfully", dataset_detail_fields) - @api.response(404, "Dataset not found") - @api.response(403, "Permission denied") + @console_ns.doc("get_dataset") + @console_ns.doc(description="Get dataset details") + @console_ns.doc(params={"dataset_id": "Dataset ID"}) + @console_ns.response(200, "Dataset retrieved successfully", dataset_detail_fields) + @console_ns.response(404, "Dataset not found") + @console_ns.response(403, "Permission denied") @setup_required @login_required @account_initialization_required @@ -328,10 +328,10 @@ class DatasetApi(Resource): return data, 200 - @api.doc("update_dataset") - @api.doc(description="Update dataset details") - @api.expect( - api.model( + @console_ns.doc("update_dataset") + @console_ns.doc(description="Update dataset details") + @console_ns.expect( + console_ns.model( "UpdateDatasetRequest", { "name": fields.String(description="Dataset name"), @@ -342,9 +342,9 @@ class DatasetApi(Resource): }, ) ) - @api.response(200, "Dataset updated successfully", dataset_detail_fields) - @api.response(404, "Dataset not found") - @api.response(403, "Permission denied") + @console_ns.response(200, "Dataset updated successfully", dataset_detail_fields) + @console_ns.response(404, "Dataset not found") + @console_ns.response(403, "Permission denied") @setup_required @login_required @account_initialization_required @@ -488,10 +488,10 @@ class DatasetApi(Resource): @console_ns.route("/datasets//use-check") class DatasetUseCheckApi(Resource): - @api.doc("check_dataset_use") - @api.doc(description="Check if dataset is in use") - @api.doc(params={"dataset_id": "Dataset ID"}) - @api.response(200, "Dataset use status retrieved successfully") + @console_ns.doc("check_dataset_use") + @console_ns.doc(description="Check if dataset is in use") + @console_ns.doc(params={"dataset_id": "Dataset ID"}) + @console_ns.response(200, "Dataset use status retrieved successfully") @setup_required @login_required @account_initialization_required @@ -504,10 +504,10 @@ class DatasetUseCheckApi(Resource): @console_ns.route("/datasets//queries") class DatasetQueryApi(Resource): - @api.doc("get_dataset_queries") - @api.doc(description="Get dataset query history") - @api.doc(params={"dataset_id": "Dataset ID"}) - @api.response(200, "Query history retrieved successfully", dataset_query_detail_fields) + @console_ns.doc("get_dataset_queries") + @console_ns.doc(description="Get dataset query history") + @console_ns.doc(params={"dataset_id": "Dataset ID"}) + @console_ns.response(200, "Query history retrieved successfully", dataset_query_detail_fields) @setup_required @login_required @account_initialization_required @@ -540,9 +540,9 @@ class DatasetQueryApi(Resource): @console_ns.route("/datasets/indexing-estimate") class DatasetIndexingEstimateApi(Resource): - @api.doc("estimate_dataset_indexing") - @api.doc(description="Estimate dataset indexing cost") - @api.response(200, "Indexing estimate calculated successfully") + @console_ns.doc("estimate_dataset_indexing") + @console_ns.doc(description="Estimate dataset indexing cost") + @console_ns.response(200, "Indexing estimate calculated successfully") @setup_required @login_required @account_initialization_required @@ -650,10 +650,10 @@ class DatasetIndexingEstimateApi(Resource): @console_ns.route("/datasets//related-apps") class DatasetRelatedAppListApi(Resource): - @api.doc("get_dataset_related_apps") - @api.doc(description="Get applications related to dataset") - @api.doc(params={"dataset_id": "Dataset ID"}) - @api.response(200, "Related apps retrieved successfully", related_app_list) + @console_ns.doc("get_dataset_related_apps") + @console_ns.doc(description="Get applications related to dataset") + @console_ns.doc(params={"dataset_id": "Dataset ID"}) + @console_ns.response(200, "Related apps retrieved successfully", related_app_list) @setup_required @login_required @account_initialization_required @@ -683,10 +683,10 @@ class DatasetRelatedAppListApi(Resource): @console_ns.route("/datasets//indexing-status") class DatasetIndexingStatusApi(Resource): - @api.doc("get_dataset_indexing_status") - @api.doc(description="Get dataset indexing status") - @api.doc(params={"dataset_id": "Dataset ID"}) - @api.response(200, "Indexing status retrieved successfully") + @console_ns.doc("get_dataset_indexing_status") + @console_ns.doc(description="Get dataset indexing status") + @console_ns.doc(params={"dataset_id": "Dataset ID"}) + @console_ns.response(200, "Indexing status retrieved successfully") @setup_required @login_required @account_initialization_required @@ -738,9 +738,9 @@ class DatasetApiKeyApi(Resource): token_prefix = "dataset-" resource_type = "dataset" - @api.doc("get_dataset_api_keys") - @api.doc(description="Get dataset API keys") - @api.response(200, "API keys retrieved successfully", api_key_list) + @console_ns.doc("get_dataset_api_keys") + @console_ns.doc(description="Get dataset API keys") + @console_ns.response(200, "API keys retrieved successfully", api_key_list) @setup_required @login_required @account_initialization_required @@ -767,7 +767,7 @@ class DatasetApiKeyApi(Resource): ) if current_key_count >= self.max_keys: - api.abort( + console_ns.abort( 400, message=f"Cannot create more than {self.max_keys} API keys for this resource type.", code="max_keys_exceeded", @@ -787,10 +787,10 @@ class DatasetApiKeyApi(Resource): class DatasetApiDeleteApi(Resource): resource_type = "dataset" - @api.doc("delete_dataset_api_key") - @api.doc(description="Delete dataset API key") - @api.doc(params={"api_key_id": "API key ID"}) - @api.response(204, "API key deleted successfully") + @console_ns.doc("delete_dataset_api_key") + @console_ns.doc(description="Delete dataset API key") + @console_ns.doc(params={"api_key_id": "API key ID"}) + @console_ns.response(204, "API key deleted successfully") @setup_required @login_required @is_admin_or_owner_required @@ -809,7 +809,7 @@ class DatasetApiDeleteApi(Resource): ) if key is None: - api.abort(404, message="API key not found") + console_ns.abort(404, message="API key not found") db.session.query(ApiToken).where(ApiToken.id == api_key_id).delete() db.session.commit() @@ -832,9 +832,9 @@ class DatasetEnableApiApi(Resource): @console_ns.route("/datasets/api-base-info") class DatasetApiBaseUrlApi(Resource): - @api.doc("get_dataset_api_base_info") - @api.doc(description="Get dataset API base information") - @api.response(200, "API base info retrieved successfully") + @console_ns.doc("get_dataset_api_base_info") + @console_ns.doc(description="Get dataset API base information") + @console_ns.response(200, "API base info retrieved successfully") @setup_required @login_required @account_initialization_required @@ -844,9 +844,9 @@ class DatasetApiBaseUrlApi(Resource): @console_ns.route("/datasets/retrieval-setting") class DatasetRetrievalSettingApi(Resource): - @api.doc("get_dataset_retrieval_setting") - @api.doc(description="Get dataset retrieval settings") - @api.response(200, "Retrieval settings retrieved successfully") + @console_ns.doc("get_dataset_retrieval_setting") + @console_ns.doc(description="Get dataset retrieval settings") + @console_ns.response(200, "Retrieval settings retrieved successfully") @setup_required @login_required @account_initialization_required @@ -857,10 +857,10 @@ class DatasetRetrievalSettingApi(Resource): @console_ns.route("/datasets/retrieval-setting/") class DatasetRetrievalSettingMockApi(Resource): - @api.doc("get_dataset_retrieval_setting_mock") - @api.doc(description="Get mock dataset retrieval settings by vector type") - @api.doc(params={"vector_type": "Vector store type"}) - @api.response(200, "Mock retrieval settings retrieved successfully") + @console_ns.doc("get_dataset_retrieval_setting_mock") + @console_ns.doc(description="Get mock dataset retrieval settings by vector type") + @console_ns.doc(params={"vector_type": "Vector store type"}) + @console_ns.response(200, "Mock retrieval settings retrieved successfully") @setup_required @login_required @account_initialization_required @@ -870,11 +870,11 @@ class DatasetRetrievalSettingMockApi(Resource): @console_ns.route("/datasets//error-docs") class DatasetErrorDocs(Resource): - @api.doc("get_dataset_error_docs") - @api.doc(description="Get dataset error documents") - @api.doc(params={"dataset_id": "Dataset ID"}) - @api.response(200, "Error documents retrieved successfully") - @api.response(404, "Dataset not found") + @console_ns.doc("get_dataset_error_docs") + @console_ns.doc(description="Get dataset error documents") + @console_ns.doc(params={"dataset_id": "Dataset ID"}) + @console_ns.response(200, "Error documents retrieved successfully") + @console_ns.response(404, "Dataset not found") @setup_required @login_required @account_initialization_required @@ -890,12 +890,12 @@ class DatasetErrorDocs(Resource): @console_ns.route("/datasets//permission-part-users") class DatasetPermissionUserListApi(Resource): - @api.doc("get_dataset_permission_users") - @api.doc(description="Get dataset permission user list") - @api.doc(params={"dataset_id": "Dataset ID"}) - @api.response(200, "Permission users retrieved successfully") - @api.response(404, "Dataset not found") - @api.response(403, "Permission denied") + @console_ns.doc("get_dataset_permission_users") + @console_ns.doc(description="Get dataset permission user list") + @console_ns.doc(params={"dataset_id": "Dataset ID"}) + @console_ns.response(200, "Permission users retrieved successfully") + @console_ns.response(404, "Dataset not found") + @console_ns.response(403, "Permission denied") @setup_required @login_required @account_initialization_required @@ -919,11 +919,11 @@ class DatasetPermissionUserListApi(Resource): @console_ns.route("/datasets//auto-disable-logs") class DatasetAutoDisableLogApi(Resource): - @api.doc("get_dataset_auto_disable_logs") - @api.doc(description="Get dataset auto disable logs") - @api.doc(params={"dataset_id": "Dataset ID"}) - @api.response(200, "Auto disable logs retrieved successfully") - @api.response(404, "Dataset not found") + @console_ns.doc("get_dataset_auto_disable_logs") + @console_ns.doc(description="Get dataset auto disable logs") + @console_ns.doc(params={"dataset_id": "Dataset ID"}) + @console_ns.response(200, "Auto disable logs retrieved successfully") + @console_ns.response(404, "Dataset not found") @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/datasets/datasets_document.py b/api/controllers/console/datasets/datasets_document.py index 92c85b4951..b5761c9ada 100644 --- a/api/controllers/console/datasets/datasets_document.py +++ b/api/controllers/console/datasets/datasets_document.py @@ -11,7 +11,7 @@ from sqlalchemy import asc, desc, select from werkzeug.exceptions import Forbidden, NotFound import services -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.app.error import ( ProviderModelCurrentlyNotSupportError, ProviderNotInitializeError, @@ -104,10 +104,10 @@ class DocumentResource(Resource): @console_ns.route("/datasets/process-rule") class GetProcessRuleApi(Resource): - @api.doc("get_process_rule") - @api.doc(description="Get dataset document processing rules") - @api.doc(params={"document_id": "Document ID (optional)"}) - @api.response(200, "Process rules retrieved successfully") + @console_ns.doc("get_process_rule") + @console_ns.doc(description="Get dataset document processing rules") + @console_ns.doc(params={"document_id": "Document ID (optional)"}) + @console_ns.response(200, "Process rules retrieved successfully") @setup_required @login_required @account_initialization_required @@ -152,9 +152,9 @@ class GetProcessRuleApi(Resource): @console_ns.route("/datasets//documents") class DatasetDocumentListApi(Resource): - @api.doc("get_dataset_documents") - @api.doc(description="Get documents in a dataset") - @api.doc( + @console_ns.doc("get_dataset_documents") + @console_ns.doc(description="Get documents in a dataset") + @console_ns.doc( params={ "dataset_id": "Dataset ID", "page": "Page number (default: 1)", @@ -165,7 +165,7 @@ class DatasetDocumentListApi(Resource): "status": "Filter documents by display status", } ) - @api.response(200, "Documents retrieved successfully") + @console_ns.response(200, "Documents retrieved successfully") @setup_required @login_required @account_initialization_required @@ -357,10 +357,10 @@ class DatasetDocumentListApi(Resource): @console_ns.route("/datasets/init") class DatasetInitApi(Resource): - @api.doc("init_dataset") - @api.doc(description="Initialize dataset with documents") - @api.expect( - api.model( + @console_ns.doc("init_dataset") + @console_ns.doc(description="Initialize dataset with documents") + @console_ns.expect( + console_ns.model( "DatasetInitRequest", { "upload_file_id": fields.String(required=True, description="Upload file ID"), @@ -370,8 +370,8 @@ class DatasetInitApi(Resource): }, ) ) - @api.response(201, "Dataset initialized successfully", dataset_and_document_fields) - @api.response(400, "Invalid request parameters") + @console_ns.response(201, "Dataset initialized successfully", dataset_and_document_fields) + @console_ns.response(400, "Invalid request parameters") @setup_required @login_required @account_initialization_required @@ -446,12 +446,12 @@ class DatasetInitApi(Resource): @console_ns.route("/datasets//documents//indexing-estimate") class DocumentIndexingEstimateApi(DocumentResource): - @api.doc("estimate_document_indexing") - @api.doc(description="Estimate document indexing cost") - @api.doc(params={"dataset_id": "Dataset ID", "document_id": "Document ID"}) - @api.response(200, "Indexing estimate calculated successfully") - @api.response(404, "Document not found") - @api.response(400, "Document already finished") + @console_ns.doc("estimate_document_indexing") + @console_ns.doc(description="Estimate document indexing cost") + @console_ns.doc(params={"dataset_id": "Dataset ID", "document_id": "Document ID"}) + @console_ns.response(200, "Indexing estimate calculated successfully") + @console_ns.response(404, "Document not found") + @console_ns.response(400, "Document already finished") @setup_required @login_required @account_initialization_required @@ -661,11 +661,11 @@ class DocumentBatchIndexingStatusApi(DocumentResource): @console_ns.route("/datasets//documents//indexing-status") class DocumentIndexingStatusApi(DocumentResource): - @api.doc("get_document_indexing_status") - @api.doc(description="Get document indexing status") - @api.doc(params={"dataset_id": "Dataset ID", "document_id": "Document ID"}) - @api.response(200, "Indexing status retrieved successfully") - @api.response(404, "Document not found") + @console_ns.doc("get_document_indexing_status") + @console_ns.doc(description="Get document indexing status") + @console_ns.doc(params={"dataset_id": "Dataset ID", "document_id": "Document ID"}) + @console_ns.response(200, "Indexing status retrieved successfully") + @console_ns.response(404, "Document not found") @setup_required @login_required @account_initialization_required @@ -711,17 +711,17 @@ class DocumentIndexingStatusApi(DocumentResource): class DocumentApi(DocumentResource): METADATA_CHOICES = {"all", "only", "without"} - @api.doc("get_document") - @api.doc(description="Get document details") - @api.doc( + @console_ns.doc("get_document") + @console_ns.doc(description="Get document details") + @console_ns.doc( params={ "dataset_id": "Dataset ID", "document_id": "Document ID", "metadata": "Metadata inclusion (all/only/without)", } ) - @api.response(200, "Document retrieved successfully") - @api.response(404, "Document not found") + @console_ns.response(200, "Document retrieved successfully") + @console_ns.response(404, "Document not found") @setup_required @login_required @account_initialization_required @@ -832,14 +832,14 @@ class DocumentApi(DocumentResource): @console_ns.route("/datasets//documents//processing/") class DocumentProcessingApi(DocumentResource): - @api.doc("update_document_processing") - @api.doc(description="Update document processing status (pause/resume)") - @api.doc( + @console_ns.doc("update_document_processing") + @console_ns.doc(description="Update document processing status (pause/resume)") + @console_ns.doc( params={"dataset_id": "Dataset ID", "document_id": "Document ID", "action": "Action to perform (pause/resume)"} ) - @api.response(200, "Processing status updated successfully") - @api.response(404, "Document not found") - @api.response(400, "Invalid action") + @console_ns.response(200, "Processing status updated successfully") + @console_ns.response(404, "Document not found") + @console_ns.response(400, "Invalid action") @setup_required @login_required @account_initialization_required @@ -877,11 +877,11 @@ class DocumentProcessingApi(DocumentResource): @console_ns.route("/datasets//documents//metadata") class DocumentMetadataApi(DocumentResource): - @api.doc("update_document_metadata") - @api.doc(description="Update document metadata") - @api.doc(params={"dataset_id": "Dataset ID", "document_id": "Document ID"}) - @api.expect( - api.model( + @console_ns.doc("update_document_metadata") + @console_ns.doc(description="Update document metadata") + @console_ns.doc(params={"dataset_id": "Dataset ID", "document_id": "Document ID"}) + @console_ns.expect( + console_ns.model( "UpdateDocumentMetadataRequest", { "doc_type": fields.String(description="Document type"), @@ -889,9 +889,9 @@ class DocumentMetadataApi(DocumentResource): }, ) ) - @api.response(200, "Document metadata updated successfully") - @api.response(404, "Document not found") - @api.response(403, "Permission denied") + @console_ns.response(200, "Document metadata updated successfully") + @console_ns.response(404, "Document not found") + @console_ns.response(403, "Permission denied") @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/datasets/external.py b/api/controllers/console/datasets/external.py index fe96a8199a..f48f384e94 100644 --- a/api/controllers/console/datasets/external.py +++ b/api/controllers/console/datasets/external.py @@ -3,7 +3,7 @@ from flask_restx import Resource, fields, marshal, reqparse from werkzeug.exceptions import Forbidden, InternalServerError, NotFound import services -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.datasets.error import DatasetNameDuplicateError from controllers.console.wraps import account_initialization_required, edit_permission_required, setup_required from fields.dataset_fields import dataset_detail_fields @@ -22,16 +22,16 @@ def _validate_name(name: str) -> str: @console_ns.route("/datasets/external-knowledge-api") class ExternalApiTemplateListApi(Resource): - @api.doc("get_external_api_templates") - @api.doc(description="Get external knowledge API templates") - @api.doc( + @console_ns.doc("get_external_api_templates") + @console_ns.doc(description="Get external knowledge API templates") + @console_ns.doc( params={ "page": "Page number (default: 1)", "limit": "Number of items per page (default: 20)", "keyword": "Search keyword", } ) - @api.response(200, "External API templates retrieved successfully") + @console_ns.response(200, "External API templates retrieved successfully") @setup_required @login_required @account_initialization_required @@ -95,11 +95,11 @@ class ExternalApiTemplateListApi(Resource): @console_ns.route("/datasets/external-knowledge-api/") class ExternalApiTemplateApi(Resource): - @api.doc("get_external_api_template") - @api.doc(description="Get external knowledge API template details") - @api.doc(params={"external_knowledge_api_id": "External knowledge API ID"}) - @api.response(200, "External API template retrieved successfully") - @api.response(404, "Template not found") + @console_ns.doc("get_external_api_template") + @console_ns.doc(description="Get external knowledge API template details") + @console_ns.doc(params={"external_knowledge_api_id": "External knowledge API ID"}) + @console_ns.response(200, "External API template retrieved successfully") + @console_ns.response(404, "Template not found") @setup_required @login_required @account_initialization_required @@ -163,10 +163,10 @@ class ExternalApiTemplateApi(Resource): @console_ns.route("/datasets/external-knowledge-api//use-check") class ExternalApiUseCheckApi(Resource): - @api.doc("check_external_api_usage") - @api.doc(description="Check if external knowledge API is being used") - @api.doc(params={"external_knowledge_api_id": "External knowledge API ID"}) - @api.response(200, "Usage check completed successfully") + @console_ns.doc("check_external_api_usage") + @console_ns.doc(description="Check if external knowledge API is being used") + @console_ns.doc(params={"external_knowledge_api_id": "External knowledge API ID"}) + @console_ns.response(200, "Usage check completed successfully") @setup_required @login_required @account_initialization_required @@ -181,10 +181,10 @@ class ExternalApiUseCheckApi(Resource): @console_ns.route("/datasets/external") class ExternalDatasetCreateApi(Resource): - @api.doc("create_external_dataset") - @api.doc(description="Create external knowledge dataset") - @api.expect( - api.model( + @console_ns.doc("create_external_dataset") + @console_ns.doc(description="Create external knowledge dataset") + @console_ns.expect( + console_ns.model( "CreateExternalDatasetRequest", { "external_knowledge_api_id": fields.String(required=True, description="External knowledge API ID"), @@ -194,9 +194,9 @@ class ExternalDatasetCreateApi(Resource): }, ) ) - @api.response(201, "External dataset created successfully", dataset_detail_fields) - @api.response(400, "Invalid parameters") - @api.response(403, "Permission denied") + @console_ns.response(201, "External dataset created successfully", dataset_detail_fields) + @console_ns.response(400, "Invalid parameters") + @console_ns.response(403, "Permission denied") @setup_required @login_required @account_initialization_required @@ -239,11 +239,11 @@ class ExternalDatasetCreateApi(Resource): @console_ns.route("/datasets//external-hit-testing") class ExternalKnowledgeHitTestingApi(Resource): - @api.doc("test_external_knowledge_retrieval") - @api.doc(description="Test external knowledge retrieval for dataset") - @api.doc(params={"dataset_id": "Dataset ID"}) - @api.expect( - api.model( + @console_ns.doc("test_external_knowledge_retrieval") + @console_ns.doc(description="Test external knowledge retrieval for dataset") + @console_ns.doc(params={"dataset_id": "Dataset ID"}) + @console_ns.expect( + console_ns.model( "ExternalHitTestingRequest", { "query": fields.String(required=True, description="Query text for testing"), @@ -252,9 +252,9 @@ class ExternalKnowledgeHitTestingApi(Resource): }, ) ) - @api.response(200, "External hit testing completed successfully") - @api.response(404, "Dataset not found") - @api.response(400, "Invalid parameters") + @console_ns.response(200, "External hit testing completed successfully") + @console_ns.response(404, "Dataset not found") + @console_ns.response(400, "Invalid parameters") @setup_required @login_required @account_initialization_required @@ -297,10 +297,10 @@ class ExternalKnowledgeHitTestingApi(Resource): @console_ns.route("/test/retrieval") class BedrockRetrievalApi(Resource): # this api is only for internal testing - @api.doc("bedrock_retrieval_test") - @api.doc(description="Bedrock retrieval test (internal use only)") - @api.expect( - api.model( + @console_ns.doc("bedrock_retrieval_test") + @console_ns.doc(description="Bedrock retrieval test (internal use only)") + @console_ns.expect( + console_ns.model( "BedrockRetrievalTestRequest", { "retrieval_setting": fields.Raw(required=True, description="Retrieval settings"), @@ -309,7 +309,7 @@ class BedrockRetrievalApi(Resource): }, ) ) - @api.response(200, "Bedrock retrieval test completed") + @console_ns.response(200, "Bedrock retrieval test completed") def post(self): parser = ( reqparse.RequestParser() diff --git a/api/controllers/console/datasets/hit_testing.py b/api/controllers/console/datasets/hit_testing.py index abaca88090..7ba2eeb7dd 100644 --- a/api/controllers/console/datasets/hit_testing.py +++ b/api/controllers/console/datasets/hit_testing.py @@ -1,6 +1,6 @@ from flask_restx import Resource, fields -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.datasets.hit_testing_base import DatasetsHitTestingBase from controllers.console.wraps import ( account_initialization_required, @@ -12,11 +12,11 @@ from libs.login import login_required @console_ns.route("/datasets//hit-testing") class HitTestingApi(Resource, DatasetsHitTestingBase): - @api.doc("test_dataset_retrieval") - @api.doc(description="Test dataset knowledge retrieval") - @api.doc(params={"dataset_id": "Dataset ID"}) - @api.expect( - api.model( + @console_ns.doc("test_dataset_retrieval") + @console_ns.doc(description="Test dataset knowledge retrieval") + @console_ns.doc(params={"dataset_id": "Dataset ID"}) + @console_ns.expect( + console_ns.model( "HitTestingRequest", { "query": fields.String(required=True, description="Query text for testing"), @@ -26,9 +26,9 @@ class HitTestingApi(Resource, DatasetsHitTestingBase): }, ) ) - @api.response(200, "Hit testing completed successfully") - @api.response(404, "Dataset not found") - @api.response(400, "Invalid parameters") + @console_ns.response(200, "Hit testing completed successfully") + @console_ns.response(404, "Dataset not found") + @console_ns.response(400, "Invalid parameters") @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/datasets/rag_pipeline/datasource_auth.py b/api/controllers/console/datasets/rag_pipeline/datasource_auth.py index f83ee69beb..cf9e5d2990 100644 --- a/api/controllers/console/datasets/rag_pipeline/datasource_auth.py +++ b/api/controllers/console/datasets/rag_pipeline/datasource_auth.py @@ -3,7 +3,7 @@ from flask_restx import Resource, reqparse from werkzeug.exceptions import Forbidden, NotFound from configs import dify_config -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.wraps import account_initialization_required, edit_permission_required, setup_required from core.model_runtime.errors.validate import CredentialsValidateFailedError from core.model_runtime.utils.encoders import jsonable_encoder @@ -130,7 +130,7 @@ parser_datasource = ( @console_ns.route("/auth/plugin/datasource/") class DatasourceAuth(Resource): - @api.expect(parser_datasource) + @console_ns.expect(parser_datasource) @setup_required @login_required @account_initialization_required @@ -176,7 +176,7 @@ parser_datasource_delete = reqparse.RequestParser().add_argument( @console_ns.route("/auth/plugin/datasource//delete") class DatasourceAuthDeleteApi(Resource): - @api.expect(parser_datasource_delete) + @console_ns.expect(parser_datasource_delete) @setup_required @login_required @account_initialization_required @@ -209,7 +209,7 @@ parser_datasource_update = ( @console_ns.route("/auth/plugin/datasource//update") class DatasourceAuthUpdateApi(Resource): - @api.expect(parser_datasource_update) + @console_ns.expect(parser_datasource_update) @setup_required @login_required @account_initialization_required @@ -267,7 +267,7 @@ parser_datasource_custom = ( @console_ns.route("/auth/plugin/datasource//custom-client") class DatasourceAuthOauthCustomClient(Resource): - @api.expect(parser_datasource_custom) + @console_ns.expect(parser_datasource_custom) @setup_required @login_required @account_initialization_required @@ -306,7 +306,7 @@ parser_default = reqparse.RequestParser().add_argument("id", type=str, required= @console_ns.route("/auth/plugin/datasource//default") class DatasourceAuthDefaultApi(Resource): - @api.expect(parser_default) + @console_ns.expect(parser_default) @setup_required @login_required @account_initialization_required @@ -334,7 +334,7 @@ parser_update_name = ( @console_ns.route("/auth/plugin/datasource//update-name") class DatasourceUpdateProviderNameApi(Resource): - @api.expect(parser_update_name) + @console_ns.expect(parser_update_name) @setup_required @login_required @account_initialization_required 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 5e3b3428eb..42387557d6 100644 --- a/api/controllers/console/datasets/rag_pipeline/datasource_content_preview.py +++ b/api/controllers/console/datasets/rag_pipeline/datasource_content_preview.py @@ -4,7 +4,7 @@ from flask_restx import ( # type: ignore from pydantic import BaseModel from werkzeug.exceptions import Forbidden -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.datasets.wraps import get_rag_pipeline from controllers.console.wraps import account_initialization_required, setup_required from libs.login import current_user, login_required @@ -26,7 +26,7 @@ console_ns.schema_model(Parser.__name__, Parser.model_json_schema(ref_template=D @console_ns.route("/rag/pipelines//workflows/published/datasource/nodes//preview") class DataSourceContentPreviewApi(Resource): - @api.expect(console_ns.models[Parser.__name__], validate=True) + @console_ns.expect(console_ns.models[Parser.__name__], validate=True) @setup_required @login_required @account_initialization_required @@ -38,7 +38,7 @@ class DataSourceContentPreviewApi(Resource): if not isinstance(current_user, Account): raise Forbidden() - args = Parser.model_validate(api.payload) + args = Parser.model_validate(console_ns.payload) inputs = args.inputs datasource_type = args.datasource_type 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 bc8d4fbf81..a0dc692c4e 100644 --- a/api/controllers/console/datasets/rag_pipeline/rag_pipeline_workflow.py +++ b/api/controllers/console/datasets/rag_pipeline/rag_pipeline_workflow.py @@ -9,7 +9,7 @@ from sqlalchemy.orm import Session from werkzeug.exceptions import Forbidden, InternalServerError, NotFound import services -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.app.error import ( ConversationCompletedError, DraftWorkflowNotExist, @@ -153,7 +153,7 @@ parser_run = reqparse.RequestParser().add_argument("inputs", type=dict, location @console_ns.route("/rag/pipelines//workflows/draft/iteration/nodes//run") class RagPipelineDraftRunIterationNodeApi(Resource): - @api.expect(parser_run) + @console_ns.expect(parser_run) @setup_required @login_required @account_initialization_required @@ -187,7 +187,7 @@ class RagPipelineDraftRunIterationNodeApi(Resource): @console_ns.route("/rag/pipelines//workflows/draft/loop/nodes//run") class RagPipelineDraftRunLoopNodeApi(Resource): - @api.expect(parser_run) + @console_ns.expect(parser_run) @setup_required @login_required @account_initialization_required @@ -230,7 +230,7 @@ parser_draft_run = ( @console_ns.route("/rag/pipelines//workflows/draft/run") class DraftRagPipelineRunApi(Resource): - @api.expect(parser_draft_run) + @console_ns.expect(parser_draft_run) @setup_required @login_required @account_initialization_required @@ -273,7 +273,7 @@ parser_published_run = ( @console_ns.route("/rag/pipelines//workflows/published/run") class PublishedRagPipelineRunApi(Resource): - @api.expect(parser_published_run) + @console_ns.expect(parser_published_run) @setup_required @login_required @account_initialization_required @@ -397,7 +397,7 @@ parser_rag_run = ( @console_ns.route("/rag/pipelines//workflows/published/datasource/nodes//run") class RagPipelinePublishedDatasourceNodeRunApi(Resource): - @api.expect(parser_rag_run) + @console_ns.expect(parser_rag_run) @setup_required @login_required @account_initialization_required @@ -437,7 +437,7 @@ class RagPipelinePublishedDatasourceNodeRunApi(Resource): @console_ns.route("/rag/pipelines//workflows/draft/datasource/nodes//run") class RagPipelineDraftDatasourceNodeRunApi(Resource): - @api.expect(parser_rag_run) + @console_ns.expect(parser_rag_run) @setup_required @login_required @edit_permission_required @@ -482,7 +482,7 @@ parser_run_api = reqparse.RequestParser().add_argument( @console_ns.route("/rag/pipelines//workflows/draft/nodes//run") class RagPipelineDraftNodeRunApi(Resource): - @api.expect(parser_run_api) + @console_ns.expect(parser_run_api) @setup_required @login_required @edit_permission_required @@ -607,7 +607,7 @@ parser_default = reqparse.RequestParser().add_argument("q", type=str, location=" @console_ns.route("/rag/pipelines//workflows/default-workflow-block-configs/") class DefaultRagPipelineBlockConfigApi(Resource): - @api.expect(parser_default) + @console_ns.expect(parser_default) @setup_required @login_required @account_initialization_required @@ -644,7 +644,7 @@ parser_wf = ( @console_ns.route("/rag/pipelines//workflows") class PublishedAllRagPipelineApi(Resource): - @api.expect(parser_wf) + @console_ns.expect(parser_wf) @setup_required @login_required @account_initialization_required @@ -696,7 +696,7 @@ parser_wf_id = ( @console_ns.route("/rag/pipelines//workflows/") class RagPipelineByIdApi(Resource): - @api.expect(parser_wf_id) + @console_ns.expect(parser_wf_id) @setup_required @login_required @account_initialization_required @@ -754,7 +754,7 @@ parser_parameters = reqparse.RequestParser().add_argument("node_id", type=str, r @console_ns.route("/rag/pipelines//workflows/published/processing/parameters") class PublishedRagPipelineSecondStepApi(Resource): - @api.expect(parser_parameters) + @console_ns.expect(parser_parameters) @setup_required @login_required @account_initialization_required @@ -777,7 +777,7 @@ class PublishedRagPipelineSecondStepApi(Resource): @console_ns.route("/rag/pipelines//workflows/published/pre-processing/parameters") class PublishedRagPipelineFirstStepApi(Resource): - @api.expect(parser_parameters) + @console_ns.expect(parser_parameters) @setup_required @login_required @account_initialization_required @@ -800,7 +800,7 @@ class PublishedRagPipelineFirstStepApi(Resource): @console_ns.route("/rag/pipelines//workflows/draft/pre-processing/parameters") class DraftRagPipelineFirstStepApi(Resource): - @api.expect(parser_parameters) + @console_ns.expect(parser_parameters) @setup_required @login_required @account_initialization_required @@ -823,7 +823,7 @@ class DraftRagPipelineFirstStepApi(Resource): @console_ns.route("/rag/pipelines//workflows/draft/processing/parameters") class DraftRagPipelineSecondStepApi(Resource): - @api.expect(parser_parameters) + @console_ns.expect(parser_parameters) @setup_required @login_required @account_initialization_required @@ -854,7 +854,7 @@ parser_wf_run = ( @console_ns.route("/rag/pipelines//workflow-runs") class RagPipelineWorkflowRunListApi(Resource): - @api.expect(parser_wf_run) + @console_ns.expect(parser_wf_run) @setup_required @login_required @account_initialization_required @@ -975,7 +975,7 @@ parser_var = ( @console_ns.route("/rag/pipelines//workflows/draft/datasource/variables-inspect") class RagPipelineDatasourceVariableApi(Resource): - @api.expect(parser_var) + @console_ns.expect(parser_var) @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/datasets/website.py b/api/controllers/console/datasets/website.py index fe6eaaa0de..b2998a8d3e 100644 --- a/api/controllers/console/datasets/website.py +++ b/api/controllers/console/datasets/website.py @@ -1,6 +1,6 @@ from flask_restx import Resource, fields, reqparse -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.datasets.error import WebsiteCrawlError from controllers.console.wraps import account_initialization_required, setup_required from libs.login import login_required @@ -9,10 +9,10 @@ from services.website_service import WebsiteCrawlApiRequest, WebsiteCrawlStatusA @console_ns.route("/website/crawl") class WebsiteCrawlApi(Resource): - @api.doc("crawl_website") - @api.doc(description="Crawl website content") - @api.expect( - api.model( + @console_ns.doc("crawl_website") + @console_ns.doc(description="Crawl website content") + @console_ns.expect( + console_ns.model( "WebsiteCrawlRequest", { "provider": fields.String( @@ -25,8 +25,8 @@ class WebsiteCrawlApi(Resource): }, ) ) - @api.response(200, "Website crawl initiated successfully") - @api.response(400, "Invalid crawl parameters") + @console_ns.response(200, "Website crawl initiated successfully") + @console_ns.response(400, "Invalid crawl parameters") @setup_required @login_required @account_initialization_required @@ -62,12 +62,12 @@ class WebsiteCrawlApi(Resource): @console_ns.route("/website/crawl/status/") class WebsiteCrawlStatusApi(Resource): - @api.doc("get_crawl_status") - @api.doc(description="Get website crawl status") - @api.doc(params={"job_id": "Crawl job ID", "provider": "Crawl provider (firecrawl/watercrawl/jinareader)"}) - @api.response(200, "Crawl status retrieved successfully") - @api.response(404, "Crawl job not found") - @api.response(400, "Invalid provider") + @console_ns.doc("get_crawl_status") + @console_ns.doc(description="Get website crawl status") + @console_ns.doc(params={"job_id": "Crawl job ID", "provider": "Crawl provider (firecrawl/watercrawl/jinareader)"}) + @console_ns.response(200, "Crawl status retrieved successfully") + @console_ns.response(404, "Crawl job not found") + @console_ns.response(400, "Invalid provider") @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/datasets/wraps.py b/api/controllers/console/datasets/wraps.py index a8c1298e3e..3ef1341abc 100644 --- a/api/controllers/console/datasets/wraps.py +++ b/api/controllers/console/datasets/wraps.py @@ -1,44 +1,40 @@ from collections.abc import Callable from functools import wraps +from typing import ParamSpec, TypeVar from controllers.console.datasets.error import PipelineNotFoundError from extensions.ext_database import db from libs.login import current_account_with_tenant from models.dataset import Pipeline +P = ParamSpec("P") +R = TypeVar("R") -def get_rag_pipeline( - view: Callable | None = None, -): - def decorator(view_func): - @wraps(view_func) - def decorated_view(*args, **kwargs): - if not kwargs.get("pipeline_id"): - raise ValueError("missing pipeline_id in path parameters") - _, current_tenant_id = current_account_with_tenant() +def get_rag_pipeline(view_func: Callable[P, R]): + @wraps(view_func) + def decorated_view(*args: P.args, **kwargs: P.kwargs): + if not kwargs.get("pipeline_id"): + raise ValueError("missing pipeline_id in path parameters") - pipeline_id = kwargs.get("pipeline_id") - pipeline_id = str(pipeline_id) + _, current_tenant_id = current_account_with_tenant() - del kwargs["pipeline_id"] + pipeline_id = kwargs.get("pipeline_id") + pipeline_id = str(pipeline_id) - pipeline = ( - db.session.query(Pipeline) - .where(Pipeline.id == pipeline_id, Pipeline.tenant_id == current_tenant_id) - .first() - ) + del kwargs["pipeline_id"] - if not pipeline: - raise PipelineNotFoundError() + pipeline = ( + db.session.query(Pipeline) + .where(Pipeline.id == pipeline_id, Pipeline.tenant_id == current_tenant_id) + .first() + ) - kwargs["pipeline"] = pipeline + if not pipeline: + raise PipelineNotFoundError() - return view_func(*args, **kwargs) + kwargs["pipeline"] = pipeline - return decorated_view + return view_func(*args, **kwargs) - if view is None: - return decorator - else: - return decorator(view) + return decorated_view diff --git a/api/controllers/console/explore/recommended_app.py b/api/controllers/console/explore/recommended_app.py index 11c7a1bc18..5a9c3ef133 100644 --- a/api/controllers/console/explore/recommended_app.py +++ b/api/controllers/console/explore/recommended_app.py @@ -1,7 +1,7 @@ from flask_restx import Resource, fields, marshal_with, reqparse from constants.languages import languages -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.wraps import account_initialization_required from libs.helper import AppIconUrlField from libs.login import current_user, login_required @@ -40,7 +40,7 @@ parser_apps = reqparse.RequestParser().add_argument("language", type=str, locati @console_ns.route("/explore/apps") class RecommendedAppListApi(Resource): - @api.expect(parser_apps) + @console_ns.expect(parser_apps) @login_required @account_initialization_required @marshal_with(recommended_app_list_fields) diff --git a/api/controllers/console/extension.py b/api/controllers/console/extension.py index a1d36def0d..6f92b9744f 100644 --- a/api/controllers/console/extension.py +++ b/api/controllers/console/extension.py @@ -1,7 +1,7 @@ from flask_restx import Resource, fields, marshal_with, reqparse from constants import HIDDEN_VALUE -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.wraps import account_initialization_required, setup_required from fields.api_based_extension_fields import api_based_extension_fields from libs.login import current_account_with_tenant, login_required @@ -12,15 +12,17 @@ from services.code_based_extension_service import CodeBasedExtensionService @console_ns.route("/code-based-extension") class CodeBasedExtensionAPI(Resource): - @api.doc("get_code_based_extension") - @api.doc(description="Get code-based extension data by module name") - @api.expect( - api.parser().add_argument("module", type=str, required=True, location="args", help="Extension module name") + @console_ns.doc("get_code_based_extension") + @console_ns.doc(description="Get code-based extension data by module name") + @console_ns.expect( + console_ns.parser().add_argument( + "module", type=str, required=True, location="args", help="Extension module name" + ) ) - @api.response( + @console_ns.response( 200, "Success", - api.model( + console_ns.model( "CodeBasedExtensionResponse", {"module": fields.String(description="Module name"), "data": fields.Raw(description="Extension data")}, ), @@ -37,9 +39,9 @@ class CodeBasedExtensionAPI(Resource): @console_ns.route("/api-based-extension") class APIBasedExtensionAPI(Resource): - @api.doc("get_api_based_extensions") - @api.doc(description="Get all API-based extensions for current tenant") - @api.response(200, "Success", fields.List(fields.Nested(api_based_extension_fields))) + @console_ns.doc("get_api_based_extensions") + @console_ns.doc(description="Get all API-based extensions for current tenant") + @console_ns.response(200, "Success", fields.List(fields.Nested(api_based_extension_fields))) @setup_required @login_required @account_initialization_required @@ -48,10 +50,10 @@ class APIBasedExtensionAPI(Resource): _, tenant_id = current_account_with_tenant() return APIBasedExtensionService.get_all_by_tenant_id(tenant_id) - @api.doc("create_api_based_extension") - @api.doc(description="Create a new API-based extension") - @api.expect( - api.model( + @console_ns.doc("create_api_based_extension") + @console_ns.doc(description="Create a new API-based extension") + @console_ns.expect( + console_ns.model( "CreateAPIBasedExtensionRequest", { "name": fields.String(required=True, description="Extension name"), @@ -60,13 +62,13 @@ class APIBasedExtensionAPI(Resource): }, ) ) - @api.response(201, "Extension created successfully", api_based_extension_fields) + @console_ns.response(201, "Extension created successfully", api_based_extension_fields) @setup_required @login_required @account_initialization_required @marshal_with(api_based_extension_fields) def post(self): - args = api.payload + args = console_ns.payload _, current_tenant_id = current_account_with_tenant() extension_data = APIBasedExtension( @@ -81,10 +83,10 @@ class APIBasedExtensionAPI(Resource): @console_ns.route("/api-based-extension/") class APIBasedExtensionDetailAPI(Resource): - @api.doc("get_api_based_extension") - @api.doc(description="Get API-based extension by ID") - @api.doc(params={"id": "Extension ID"}) - @api.response(200, "Success", api_based_extension_fields) + @console_ns.doc("get_api_based_extension") + @console_ns.doc(description="Get API-based extension by ID") + @console_ns.doc(params={"id": "Extension ID"}) + @console_ns.response(200, "Success", api_based_extension_fields) @setup_required @login_required @account_initialization_required @@ -95,11 +97,11 @@ class APIBasedExtensionDetailAPI(Resource): return APIBasedExtensionService.get_with_tenant_id(tenant_id, api_based_extension_id) - @api.doc("update_api_based_extension") - @api.doc(description="Update API-based extension") - @api.doc(params={"id": "Extension ID"}) - @api.expect( - api.model( + @console_ns.doc("update_api_based_extension") + @console_ns.doc(description="Update API-based extension") + @console_ns.doc(params={"id": "Extension ID"}) + @console_ns.expect( + console_ns.model( "UpdateAPIBasedExtensionRequest", { "name": fields.String(required=True, description="Extension name"), @@ -108,7 +110,7 @@ class APIBasedExtensionDetailAPI(Resource): }, ) ) - @api.response(200, "Extension updated successfully", api_based_extension_fields) + @console_ns.response(200, "Extension updated successfully", api_based_extension_fields) @setup_required @login_required @account_initialization_required @@ -119,7 +121,7 @@ class APIBasedExtensionDetailAPI(Resource): extension_data_from_db = APIBasedExtensionService.get_with_tenant_id(current_tenant_id, api_based_extension_id) - args = api.payload + args = console_ns.payload extension_data_from_db.name = args["name"] extension_data_from_db.api_endpoint = args["api_endpoint"] @@ -129,10 +131,10 @@ class APIBasedExtensionDetailAPI(Resource): return APIBasedExtensionService.save(extension_data_from_db) - @api.doc("delete_api_based_extension") - @api.doc(description="Delete API-based extension") - @api.doc(params={"id": "Extension ID"}) - @api.response(204, "Extension deleted successfully") + @console_ns.doc("delete_api_based_extension") + @console_ns.doc(description="Delete API-based extension") + @console_ns.doc(params={"id": "Extension ID"}) + @console_ns.response(204, "Extension deleted successfully") @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/feature.py b/api/controllers/console/feature.py index 39bcf3424c..6951c906e9 100644 --- a/api/controllers/console/feature.py +++ b/api/controllers/console/feature.py @@ -3,18 +3,18 @@ from flask_restx import Resource, fields from libs.login import current_account_with_tenant, login_required from services.feature_service import FeatureService -from . import api, console_ns +from . import console_ns from .wraps import account_initialization_required, cloud_utm_record, setup_required @console_ns.route("/features") class FeatureApi(Resource): - @api.doc("get_tenant_features") - @api.doc(description="Get feature configuration for current tenant") - @api.response( + @console_ns.doc("get_tenant_features") + @console_ns.doc(description="Get feature configuration for current tenant") + @console_ns.response( 200, "Success", - api.model("FeatureResponse", {"features": fields.Raw(description="Feature configuration object")}), + console_ns.model("FeatureResponse", {"features": fields.Raw(description="Feature configuration object")}), ) @setup_required @login_required @@ -29,12 +29,14 @@ class FeatureApi(Resource): @console_ns.route("/system-features") class SystemFeatureApi(Resource): - @api.doc("get_system_features") - @api.doc(description="Get system-wide feature configuration") - @api.response( + @console_ns.doc("get_system_features") + @console_ns.doc(description="Get system-wide feature configuration") + @console_ns.response( 200, "Success", - api.model("SystemFeatureResponse", {"features": fields.Raw(description="System feature configuration object")}), + console_ns.model( + "SystemFeatureResponse", {"features": fields.Raw(description="System feature configuration object")} + ), ) def get(self): """Get system-wide feature configuration""" diff --git a/api/controllers/console/init_validate.py b/api/controllers/console/init_validate.py index f219425d07..f27fa26983 100644 --- a/api/controllers/console/init_validate.py +++ b/api/controllers/console/init_validate.py @@ -11,19 +11,19 @@ from libs.helper import StrLen from models.model import DifySetup from services.account_service import TenantService -from . import api, console_ns +from . import console_ns from .error import AlreadySetupError, InitValidateFailedError from .wraps import only_edition_self_hosted @console_ns.route("/init") class InitValidateAPI(Resource): - @api.doc("get_init_status") - @api.doc(description="Get initialization validation status") - @api.response( + @console_ns.doc("get_init_status") + @console_ns.doc(description="Get initialization validation status") + @console_ns.response( 200, "Success", - model=api.model( + model=console_ns.model( "InitStatusResponse", {"status": fields.String(description="Initialization status", enum=["finished", "not_started"])}, ), @@ -35,20 +35,20 @@ class InitValidateAPI(Resource): return {"status": "finished"} return {"status": "not_started"} - @api.doc("validate_init_password") - @api.doc(description="Validate initialization password for self-hosted edition") - @api.expect( - api.model( + @console_ns.doc("validate_init_password") + @console_ns.doc(description="Validate initialization password for self-hosted edition") + @console_ns.expect( + console_ns.model( "InitValidateRequest", {"password": fields.String(required=True, description="Initialization password", max_length=30)}, ) ) - @api.response( + @console_ns.response( 201, "Success", - model=api.model("InitValidateResponse", {"result": fields.String(description="Operation result")}), + model=console_ns.model("InitValidateResponse", {"result": fields.String(description="Operation result")}), ) - @api.response(400, "Already setup or validation failed") + @console_ns.response(400, "Already setup or validation failed") @only_edition_self_hosted def post(self): """Validate initialization password""" diff --git a/api/controllers/console/ping.py b/api/controllers/console/ping.py index 29f49b99de..25a3d80522 100644 --- a/api/controllers/console/ping.py +++ b/api/controllers/console/ping.py @@ -1,16 +1,16 @@ from flask_restx import Resource, fields -from . import api, console_ns +from . import console_ns @console_ns.route("/ping") class PingApi(Resource): - @api.doc("health_check") - @api.doc(description="Health check endpoint for connection testing") - @api.response( + @console_ns.doc("health_check") + @console_ns.doc(description="Health check endpoint for connection testing") + @console_ns.response( 200, "Success", - api.model("PingResponse", {"result": fields.String(description="Health check result", example="pong")}), + console_ns.model("PingResponse", {"result": fields.String(description="Health check result", example="pong")}), ) def get(self): """Health check endpoint for connection testing""" diff --git a/api/controllers/console/remote_files.py b/api/controllers/console/remote_files.py index 47c7ecde9a..49a4df1b5a 100644 --- a/api/controllers/console/remote_files.py +++ b/api/controllers/console/remote_files.py @@ -10,7 +10,6 @@ from controllers.common.errors import ( RemoteFileUploadError, UnsupportedFileTypeError, ) -from controllers.console import api from core.file import helpers as file_helpers from core.helper import ssrf_proxy from extensions.ext_database import db @@ -42,7 +41,7 @@ parser_upload = reqparse.RequestParser().add_argument("url", type=str, required= @console_ns.route("/remote-files/upload") class RemoteFileUploadApi(Resource): - @api.expect(parser_upload) + @console_ns.expect(parser_upload) @marshal_with(file_fields_with_signed_url) def post(self): args = parser_upload.parse_args() diff --git a/api/controllers/console/setup.py b/api/controllers/console/setup.py index 22929c851e..0c2a4d797b 100644 --- a/api/controllers/console/setup.py +++ b/api/controllers/console/setup.py @@ -7,7 +7,7 @@ from libs.password import valid_password from models.model import DifySetup, db from services.account_service import RegisterService, TenantService -from . import api, console_ns +from . import console_ns from .error import AlreadySetupError, NotInitValidateError from .init_validate import get_init_validate_status from .wraps import only_edition_self_hosted @@ -15,12 +15,12 @@ from .wraps import only_edition_self_hosted @console_ns.route("/setup") class SetupApi(Resource): - @api.doc("get_setup_status") - @api.doc(description="Get system setup status") - @api.response( + @console_ns.doc("get_setup_status") + @console_ns.doc(description="Get system setup status") + @console_ns.response( 200, "Success", - api.model( + console_ns.model( "SetupStatusResponse", { "step": fields.String(description="Setup step status", enum=["not_started", "finished"]), @@ -40,10 +40,10 @@ class SetupApi(Resource): return {"step": "not_started"} return {"step": "finished"} - @api.doc("setup_system") - @api.doc(description="Initialize system setup with admin account") - @api.expect( - api.model( + @console_ns.doc("setup_system") + @console_ns.doc(description="Initialize system setup with admin account") + @console_ns.expect( + console_ns.model( "SetupRequest", { "email": fields.String(required=True, description="Admin email address"), @@ -53,8 +53,10 @@ class SetupApi(Resource): }, ) ) - @api.response(201, "Success", api.model("SetupResponse", {"result": fields.String(description="Setup result")})) - @api.response(400, "Already setup or validation failed") + @console_ns.response( + 201, "Success", console_ns.model("SetupResponse", {"result": fields.String(description="Setup result")}) + ) + @console_ns.response(400, "Already setup or validation failed") @only_edition_self_hosted def post(self): """Initialize system setup with admin account""" diff --git a/api/controllers/console/tag/tags.py b/api/controllers/console/tag/tags.py index ee032756eb..17cfc3ff4b 100644 --- a/api/controllers/console/tag/tags.py +++ b/api/controllers/console/tag/tags.py @@ -2,7 +2,7 @@ from flask import request from flask_restx import Resource, marshal_with, reqparse from werkzeug.exceptions import Forbidden -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.wraps import account_initialization_required, edit_permission_required, setup_required from fields.tag_fields import dataset_tag_fields from libs.login import current_account_with_tenant, login_required @@ -43,7 +43,7 @@ class TagListApi(Resource): return tags, 200 - @api.expect(parser_tags) + @console_ns.expect(parser_tags) @setup_required @login_required @account_initialization_required @@ -68,7 +68,7 @@ parser_tag_id = reqparse.RequestParser().add_argument( @console_ns.route("/tags/") class TagUpdateDeleteApi(Resource): - @api.expect(parser_tag_id) + @console_ns.expect(parser_tag_id) @setup_required @login_required @account_initialization_required @@ -110,7 +110,7 @@ parser_create = ( @console_ns.route("/tag-bindings/create") class TagBindingCreateApi(Resource): - @api.expect(parser_create) + @console_ns.expect(parser_create) @setup_required @login_required @account_initialization_required @@ -136,7 +136,7 @@ parser_remove = ( @console_ns.route("/tag-bindings/remove") class TagBindingDeleteApi(Resource): - @api.expect(parser_remove) + @console_ns.expect(parser_remove) @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/version.py b/api/controllers/console/version.py index 104a205fc8..6c5505f42a 100644 --- a/api/controllers/console/version.py +++ b/api/controllers/console/version.py @@ -7,7 +7,7 @@ from packaging import version from configs import dify_config -from . import api, console_ns +from . import console_ns logger = logging.getLogger(__name__) @@ -18,13 +18,13 @@ parser = reqparse.RequestParser().add_argument( @console_ns.route("/version") class VersionApi(Resource): - @api.doc("check_version_update") - @api.doc(description="Check for application version updates") - @api.expect(parser) - @api.response( + @console_ns.doc("check_version_update") + @console_ns.doc(description="Check for application version updates") + @console_ns.expect(parser) + @console_ns.response( 200, "Success", - api.model( + console_ns.model( "VersionResponse", { "version": fields.String(description="Latest version number"), diff --git a/api/controllers/console/workspace/account.py b/api/controllers/console/workspace/account.py index 0833b39f41..838cd3ee95 100644 --- a/api/controllers/console/workspace/account.py +++ b/api/controllers/console/workspace/account.py @@ -8,7 +8,7 @@ from sqlalchemy.orm import Session from configs import dify_config from constants.languages import supported_language -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.auth.error import ( EmailAlreadyInUseError, EmailChangeLimitError, @@ -55,7 +55,7 @@ def _init_parser(): @console_ns.route("/account/init") class AccountInitApi(Resource): - @api.expect(_init_parser()) + @console_ns.expect(_init_parser()) @setup_required @login_required def post(self): @@ -115,7 +115,7 @@ parser_name = reqparse.RequestParser().add_argument("name", type=str, required=T @console_ns.route("/account/name") class AccountNameApi(Resource): - @api.expect(parser_name) + @console_ns.expect(parser_name) @setup_required @login_required @account_initialization_required @@ -138,7 +138,7 @@ parser_avatar = reqparse.RequestParser().add_argument("avatar", type=str, requir @console_ns.route("/account/avatar") class AccountAvatarApi(Resource): - @api.expect(parser_avatar) + @console_ns.expect(parser_avatar) @setup_required @login_required @account_initialization_required @@ -159,7 +159,7 @@ parser_interface = reqparse.RequestParser().add_argument( @console_ns.route("/account/interface-language") class AccountInterfaceLanguageApi(Resource): - @api.expect(parser_interface) + @console_ns.expect(parser_interface) @setup_required @login_required @account_initialization_required @@ -180,7 +180,7 @@ parser_theme = reqparse.RequestParser().add_argument( @console_ns.route("/account/interface-theme") class AccountInterfaceThemeApi(Resource): - @api.expect(parser_theme) + @console_ns.expect(parser_theme) @setup_required @login_required @account_initialization_required @@ -199,7 +199,7 @@ parser_timezone = reqparse.RequestParser().add_argument("timezone", type=str, re @console_ns.route("/account/timezone") class AccountTimezoneApi(Resource): - @api.expect(parser_timezone) + @console_ns.expect(parser_timezone) @setup_required @login_required @account_initialization_required @@ -227,7 +227,7 @@ parser_pw = ( @console_ns.route("/account/password") class AccountPasswordApi(Resource): - @api.expect(parser_pw) + @console_ns.expect(parser_pw) @setup_required @login_required @account_initialization_required @@ -325,7 +325,7 @@ parser_delete = ( @console_ns.route("/account/delete") class AccountDeleteApi(Resource): - @api.expect(parser_delete) + @console_ns.expect(parser_delete) @setup_required @login_required @account_initialization_required @@ -351,7 +351,7 @@ parser_feedback = ( @console_ns.route("/account/delete/feedback") class AccountDeleteUpdateFeedbackApi(Resource): - @api.expect(parser_feedback) + @console_ns.expect(parser_feedback) @setup_required def post(self): args = parser_feedback.parse_args() @@ -396,7 +396,7 @@ class EducationApi(Resource): "allow_refresh": fields.Boolean, } - @api.expect(parser_edu) + @console_ns.expect(parser_edu) @setup_required @login_required @account_initialization_required @@ -441,7 +441,7 @@ class EducationAutoCompleteApi(Resource): "has_next": fields.Boolean, } - @api.expect(parser_autocomplete) + @console_ns.expect(parser_autocomplete) @setup_required @login_required @account_initialization_required @@ -465,7 +465,7 @@ parser_change_email = ( @console_ns.route("/account/change-email") class ChangeEmailSendEmailApi(Resource): - @api.expect(parser_change_email) + @console_ns.expect(parser_change_email) @enable_change_email @setup_required @login_required @@ -517,7 +517,7 @@ parser_validity = ( @console_ns.route("/account/change-email/validity") class ChangeEmailCheckApi(Resource): - @api.expect(parser_validity) + @console_ns.expect(parser_validity) @enable_change_email @setup_required @login_required @@ -563,7 +563,7 @@ parser_reset = ( @console_ns.route("/account/change-email/reset") class ChangeEmailResetApi(Resource): - @api.expect(parser_reset) + @console_ns.expect(parser_reset) @enable_change_email @setup_required @login_required @@ -603,7 +603,7 @@ parser_check = reqparse.RequestParser().add_argument("email", type=email, requir @console_ns.route("/account/change-email/check-email-unique") class CheckEmailUnique(Resource): - @api.expect(parser_check) + @console_ns.expect(parser_check) @setup_required def post(self): args = parser_check.parse_args() diff --git a/api/controllers/console/workspace/agent_providers.py b/api/controllers/console/workspace/agent_providers.py index 0a8f49d2e5..9527fe782e 100644 --- a/api/controllers/console/workspace/agent_providers.py +++ b/api/controllers/console/workspace/agent_providers.py @@ -1,6 +1,6 @@ from flask_restx import Resource, fields -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.wraps import account_initialization_required, setup_required from core.model_runtime.utils.encoders import jsonable_encoder from libs.login import current_account_with_tenant, login_required @@ -9,9 +9,9 @@ from services.agent_service import AgentService @console_ns.route("/workspaces/current/agent-providers") class AgentProviderListApi(Resource): - @api.doc("list_agent_providers") - @api.doc(description="Get list of available agent providers") - @api.response( + @console_ns.doc("list_agent_providers") + @console_ns.doc(description="Get list of available agent providers") + @console_ns.response( 200, "Success", fields.List(fields.Raw(description="Agent provider information")), @@ -31,10 +31,10 @@ class AgentProviderListApi(Resource): @console_ns.route("/workspaces/current/agent-provider/") class AgentProviderApi(Resource): - @api.doc("get_agent_provider") - @api.doc(description="Get specific agent provider details") - @api.doc(params={"provider_name": "Agent provider name"}) - @api.response( + @console_ns.doc("get_agent_provider") + @console_ns.doc(description="Get specific agent provider details") + @console_ns.doc(params={"provider_name": "Agent provider name"}) + @console_ns.response( 200, "Success", fields.Raw(description="Agent provider details"), diff --git a/api/controllers/console/workspace/endpoint.py b/api/controllers/console/workspace/endpoint.py index ae870a630e..7216b5e0e7 100644 --- a/api/controllers/console/workspace/endpoint.py +++ b/api/controllers/console/workspace/endpoint.py @@ -1,6 +1,6 @@ from flask_restx import Resource, fields, reqparse -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.wraps import account_initialization_required, is_admin_or_owner_required, setup_required from core.model_runtime.utils.encoders import jsonable_encoder from core.plugin.impl.exc import PluginPermissionDeniedError @@ -10,10 +10,10 @@ from services.plugin.endpoint_service import EndpointService @console_ns.route("/workspaces/current/endpoints/create") class EndpointCreateApi(Resource): - @api.doc("create_endpoint") - @api.doc(description="Create a new plugin endpoint") - @api.expect( - api.model( + @console_ns.doc("create_endpoint") + @console_ns.doc(description="Create a new plugin endpoint") + @console_ns.expect( + console_ns.model( "EndpointCreateRequest", { "plugin_unique_identifier": fields.String(required=True, description="Plugin unique identifier"), @@ -22,12 +22,12 @@ class EndpointCreateApi(Resource): }, ) ) - @api.response( + @console_ns.response( 200, "Endpoint created successfully", - api.model("EndpointCreateResponse", {"success": fields.Boolean(description="Operation success")}), + console_ns.model("EndpointCreateResponse", {"success": fields.Boolean(description="Operation success")}), ) - @api.response(403, "Admin privileges required") + @console_ns.response(403, "Admin privileges required") @setup_required @login_required @is_admin_or_owner_required @@ -63,17 +63,19 @@ class EndpointCreateApi(Resource): @console_ns.route("/workspaces/current/endpoints/list") class EndpointListApi(Resource): - @api.doc("list_endpoints") - @api.doc(description="List plugin endpoints with pagination") - @api.expect( - api.parser() + @console_ns.doc("list_endpoints") + @console_ns.doc(description="List plugin endpoints with pagination") + @console_ns.expect( + console_ns.parser() .add_argument("page", type=int, required=True, location="args", help="Page number") .add_argument("page_size", type=int, required=True, location="args", help="Page size") ) - @api.response( + @console_ns.response( 200, "Success", - api.model("EndpointListResponse", {"endpoints": fields.List(fields.Raw(description="Endpoint information"))}), + console_ns.model( + "EndpointListResponse", {"endpoints": fields.List(fields.Raw(description="Endpoint information"))} + ), ) @setup_required @login_required @@ -105,18 +107,18 @@ class EndpointListApi(Resource): @console_ns.route("/workspaces/current/endpoints/list/plugin") class EndpointListForSinglePluginApi(Resource): - @api.doc("list_plugin_endpoints") - @api.doc(description="List endpoints for a specific plugin") - @api.expect( - api.parser() + @console_ns.doc("list_plugin_endpoints") + @console_ns.doc(description="List endpoints for a specific plugin") + @console_ns.expect( + console_ns.parser() .add_argument("page", type=int, required=True, location="args", help="Page number") .add_argument("page_size", type=int, required=True, location="args", help="Page size") .add_argument("plugin_id", type=str, required=True, location="args", help="Plugin ID") ) - @api.response( + @console_ns.response( 200, "Success", - api.model( + console_ns.model( "PluginEndpointListResponse", {"endpoints": fields.List(fields.Raw(description="Endpoint information"))} ), ) @@ -153,17 +155,19 @@ class EndpointListForSinglePluginApi(Resource): @console_ns.route("/workspaces/current/endpoints/delete") class EndpointDeleteApi(Resource): - @api.doc("delete_endpoint") - @api.doc(description="Delete a plugin endpoint") - @api.expect( - api.model("EndpointDeleteRequest", {"endpoint_id": fields.String(required=True, description="Endpoint ID")}) + @console_ns.doc("delete_endpoint") + @console_ns.doc(description="Delete a plugin endpoint") + @console_ns.expect( + console_ns.model( + "EndpointDeleteRequest", {"endpoint_id": fields.String(required=True, description="Endpoint ID")} + ) ) - @api.response( + @console_ns.response( 200, "Endpoint deleted successfully", - api.model("EndpointDeleteResponse", {"success": fields.Boolean(description="Operation success")}), + console_ns.model("EndpointDeleteResponse", {"success": fields.Boolean(description="Operation success")}), ) - @api.response(403, "Admin privileges required") + @console_ns.response(403, "Admin privileges required") @setup_required @login_required @is_admin_or_owner_required @@ -183,10 +187,10 @@ class EndpointDeleteApi(Resource): @console_ns.route("/workspaces/current/endpoints/update") class EndpointUpdateApi(Resource): - @api.doc("update_endpoint") - @api.doc(description="Update a plugin endpoint") - @api.expect( - api.model( + @console_ns.doc("update_endpoint") + @console_ns.doc(description="Update a plugin endpoint") + @console_ns.expect( + console_ns.model( "EndpointUpdateRequest", { "endpoint_id": fields.String(required=True, description="Endpoint ID"), @@ -195,12 +199,12 @@ class EndpointUpdateApi(Resource): }, ) ) - @api.response( + @console_ns.response( 200, "Endpoint updated successfully", - api.model("EndpointUpdateResponse", {"success": fields.Boolean(description="Operation success")}), + console_ns.model("EndpointUpdateResponse", {"success": fields.Boolean(description="Operation success")}), ) - @api.response(403, "Admin privileges required") + @console_ns.response(403, "Admin privileges required") @setup_required @login_required @is_admin_or_owner_required @@ -233,17 +237,19 @@ class EndpointUpdateApi(Resource): @console_ns.route("/workspaces/current/endpoints/enable") class EndpointEnableApi(Resource): - @api.doc("enable_endpoint") - @api.doc(description="Enable a plugin endpoint") - @api.expect( - api.model("EndpointEnableRequest", {"endpoint_id": fields.String(required=True, description="Endpoint ID")}) + @console_ns.doc("enable_endpoint") + @console_ns.doc(description="Enable a plugin endpoint") + @console_ns.expect( + console_ns.model( + "EndpointEnableRequest", {"endpoint_id": fields.String(required=True, description="Endpoint ID")} + ) ) - @api.response( + @console_ns.response( 200, "Endpoint enabled successfully", - api.model("EndpointEnableResponse", {"success": fields.Boolean(description="Operation success")}), + console_ns.model("EndpointEnableResponse", {"success": fields.Boolean(description="Operation success")}), ) - @api.response(403, "Admin privileges required") + @console_ns.response(403, "Admin privileges required") @setup_required @login_required @is_admin_or_owner_required @@ -263,17 +269,19 @@ class EndpointEnableApi(Resource): @console_ns.route("/workspaces/current/endpoints/disable") class EndpointDisableApi(Resource): - @api.doc("disable_endpoint") - @api.doc(description="Disable a plugin endpoint") - @api.expect( - api.model("EndpointDisableRequest", {"endpoint_id": fields.String(required=True, description="Endpoint ID")}) + @console_ns.doc("disable_endpoint") + @console_ns.doc(description="Disable a plugin endpoint") + @console_ns.expect( + console_ns.model( + "EndpointDisableRequest", {"endpoint_id": fields.String(required=True, description="Endpoint ID")} + ) ) - @api.response( + @console_ns.response( 200, "Endpoint disabled successfully", - api.model("EndpointDisableResponse", {"success": fields.Boolean(description="Operation success")}), + console_ns.model("EndpointDisableResponse", {"success": fields.Boolean(description="Operation success")}), ) - @api.response(403, "Admin privileges required") + @console_ns.response(403, "Admin privileges required") @setup_required @login_required @is_admin_or_owner_required diff --git a/api/controllers/console/workspace/members.py b/api/controllers/console/workspace/members.py index 3ca453f1da..f17f8e4bcf 100644 --- a/api/controllers/console/workspace/members.py +++ b/api/controllers/console/workspace/members.py @@ -5,7 +5,7 @@ from flask_restx import Resource, marshal_with, reqparse import services from configs import dify_config -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.auth.error import ( CannotTransferOwnerToSelfError, EmailCodeError, @@ -60,7 +60,7 @@ parser_invite = ( class MemberInviteEmailApi(Resource): """Invite a new member by email.""" - @api.expect(parser_invite) + @console_ns.expect(parser_invite) @setup_required @login_required @account_initialization_required @@ -153,7 +153,7 @@ parser_update = reqparse.RequestParser().add_argument("role", type=str, required class MemberUpdateRoleApi(Resource): """Update member role.""" - @api.expect(parser_update) + @console_ns.expect(parser_update) @setup_required @login_required @account_initialization_required @@ -204,7 +204,7 @@ parser_send = reqparse.RequestParser().add_argument("language", type=str, requir class SendOwnerTransferEmailApi(Resource): """Send owner transfer email.""" - @api.expect(parser_send) + @console_ns.expect(parser_send) @setup_required @login_required @account_initialization_required @@ -247,7 +247,7 @@ parser_owner = ( @console_ns.route("/workspaces/current/members/owner-transfer-check") class OwnerTransferCheckApi(Resource): - @api.expect(parser_owner) + @console_ns.expect(parser_owner) @setup_required @login_required @account_initialization_required @@ -295,7 +295,7 @@ parser_owner_transfer = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/members//owner-transfer") class OwnerTransfer(Resource): - @api.expect(parser_owner_transfer) + @console_ns.expect(parser_owner_transfer) @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/workspace/model_providers.py b/api/controllers/console/workspace/model_providers.py index 05731b3832..8ca69121bf 100644 --- a/api/controllers/console/workspace/model_providers.py +++ b/api/controllers/console/workspace/model_providers.py @@ -3,7 +3,7 @@ import io from flask import send_file from flask_restx import Resource, reqparse -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.wraps import account_initialization_required, is_admin_or_owner_required, setup_required from core.model_runtime.entities.model_entities import ModelType from core.model_runtime.errors.validate import CredentialsValidateFailedError @@ -25,7 +25,7 @@ parser_model = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/model-providers") class ModelProviderListApi(Resource): - @api.expect(parser_model) + @console_ns.expect(parser_model) @setup_required @login_required @account_initialization_required @@ -64,7 +64,7 @@ parser_delete_cred = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/model-providers//credentials") class ModelProviderCredentialApi(Resource): - @api.expect(parser_cred) + @console_ns.expect(parser_cred) @setup_required @login_required @account_initialization_required @@ -81,7 +81,7 @@ class ModelProviderCredentialApi(Resource): return {"credentials": credentials} - @api.expect(parser_post_cred) + @console_ns.expect(parser_post_cred) @setup_required @login_required @is_admin_or_owner_required @@ -104,7 +104,7 @@ class ModelProviderCredentialApi(Resource): return {"result": "success"}, 201 - @api.expect(parser_put_cred) + @console_ns.expect(parser_put_cred) @setup_required @login_required @is_admin_or_owner_required @@ -129,7 +129,7 @@ class ModelProviderCredentialApi(Resource): return {"result": "success"} - @api.expect(parser_delete_cred) + @console_ns.expect(parser_delete_cred) @setup_required @login_required @is_admin_or_owner_required @@ -153,7 +153,7 @@ parser_switch = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/model-providers//credentials/switch") class ModelProviderCredentialSwitchApi(Resource): - @api.expect(parser_switch) + @console_ns.expect(parser_switch) @setup_required @login_required @is_admin_or_owner_required @@ -178,7 +178,7 @@ parser_validate = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/model-providers//credentials/validate") class ModelProviderValidateApi(Resource): - @api.expect(parser_validate) + @console_ns.expect(parser_validate) @setup_required @login_required @account_initialization_required @@ -240,7 +240,7 @@ parser_preferred = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/model-providers//preferred-provider-type") class PreferredProviderTypeUpdateApi(Resource): - @api.expect(parser_preferred) + @console_ns.expect(parser_preferred) @setup_required @login_required @is_admin_or_owner_required diff --git a/api/controllers/console/workspace/models.py b/api/controllers/console/workspace/models.py index 79079f692e..2aca73806a 100644 --- a/api/controllers/console/workspace/models.py +++ b/api/controllers/console/workspace/models.py @@ -2,7 +2,7 @@ import logging from flask_restx import Resource, reqparse -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.wraps import account_initialization_required, is_admin_or_owner_required, setup_required from core.model_runtime.entities.model_entities import ModelType from core.model_runtime.errors.validate import CredentialsValidateFailedError @@ -30,7 +30,7 @@ parser_post_default = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/default-model") class DefaultModelApi(Resource): - @api.expect(parser_get_default) + @console_ns.expect(parser_get_default) @setup_required @login_required @account_initialization_required @@ -46,7 +46,7 @@ class DefaultModelApi(Resource): return jsonable_encoder({"data": default_model_entity}) - @api.expect(parser_post_default) + @console_ns.expect(parser_post_default) @setup_required @login_required @is_admin_or_owner_required @@ -127,7 +127,7 @@ class ModelProviderModelApi(Resource): return jsonable_encoder({"data": models}) - @api.expect(parser_post_models) + @console_ns.expect(parser_post_models) @setup_required @login_required @is_admin_or_owner_required @@ -173,7 +173,7 @@ class ModelProviderModelApi(Resource): return {"result": "success"}, 200 - @api.expect(parser_delete_models) + @console_ns.expect(parser_delete_models) @setup_required @login_required @is_admin_or_owner_required @@ -253,7 +253,7 @@ parser_delete_cred = ( @console_ns.route("/workspaces/current/model-providers//models/credentials") class ModelProviderModelCredentialApi(Resource): - @api.expect(parser_get_credentials) + @console_ns.expect(parser_get_credentials) @setup_required @login_required @account_initialization_required @@ -304,7 +304,7 @@ class ModelProviderModelCredentialApi(Resource): } ) - @api.expect(parser_post_cred) + @console_ns.expect(parser_post_cred) @setup_required @login_required @is_admin_or_owner_required @@ -336,7 +336,7 @@ class ModelProviderModelCredentialApi(Resource): return {"result": "success"}, 201 - @api.expect(parser_put_cred) + @console_ns.expect(parser_put_cred) @setup_required @login_required @is_admin_or_owner_required @@ -362,7 +362,7 @@ class ModelProviderModelCredentialApi(Resource): return {"result": "success"} - @api.expect(parser_delete_cred) + @console_ns.expect(parser_delete_cred) @setup_required @login_required @is_admin_or_owner_required @@ -400,7 +400,7 @@ parser_switch = ( @console_ns.route("/workspaces/current/model-providers//models/credentials/switch") class ModelProviderModelCredentialSwitchApi(Resource): - @api.expect(parser_switch) + @console_ns.expect(parser_switch) @setup_required @login_required @is_admin_or_owner_required @@ -439,7 +439,7 @@ parser_model_enable_disable = ( "/workspaces/current/model-providers//models/enable", endpoint="model-provider-model-enable" ) class ModelProviderModelEnableApi(Resource): - @api.expect(parser_model_enable_disable) + @console_ns.expect(parser_model_enable_disable) @setup_required @login_required @account_initialization_required @@ -460,7 +460,7 @@ class ModelProviderModelEnableApi(Resource): "/workspaces/current/model-providers//models/disable", endpoint="model-provider-model-disable" ) class ModelProviderModelDisableApi(Resource): - @api.expect(parser_model_enable_disable) + @console_ns.expect(parser_model_enable_disable) @setup_required @login_required @account_initialization_required @@ -494,7 +494,7 @@ parser_validate = ( @console_ns.route("/workspaces/current/model-providers//models/credentials/validate") class ModelProviderModelValidateApi(Resource): - @api.expect(parser_validate) + @console_ns.expect(parser_validate) @setup_required @login_required @account_initialization_required @@ -535,7 +535,7 @@ parser_parameter = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/model-providers//models/parameter-rules") class ModelProviderModelParameterRuleApi(Resource): - @api.expect(parser_parameter) + @console_ns.expect(parser_parameter) @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/workspace/plugin.py b/api/controllers/console/workspace/plugin.py index deae418e96..e3345033f8 100644 --- a/api/controllers/console/workspace/plugin.py +++ b/api/controllers/console/workspace/plugin.py @@ -5,7 +5,7 @@ from flask_restx import Resource, reqparse from werkzeug.exceptions import Forbidden from configs import dify_config -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.workspace import plugin_permission_required from controllers.console.wraps import account_initialization_required, is_admin_or_owner_required, setup_required from core.model_runtime.utils.encoders import jsonable_encoder @@ -46,7 +46,7 @@ parser_list = ( @console_ns.route("/workspaces/current/plugin/list") class PluginListApi(Resource): - @api.expect(parser_list) + @console_ns.expect(parser_list) @setup_required @login_required @account_initialization_required @@ -66,7 +66,7 @@ parser_latest = reqparse.RequestParser().add_argument("plugin_ids", type=list, r @console_ns.route("/workspaces/current/plugin/list/latest-versions") class PluginListLatestVersionsApi(Resource): - @api.expect(parser_latest) + @console_ns.expect(parser_latest) @setup_required @login_required @account_initialization_required @@ -86,7 +86,7 @@ parser_ids = reqparse.RequestParser().add_argument("plugin_ids", type=list, requ @console_ns.route("/workspaces/current/plugin/list/installations/ids") class PluginListInstallationsFromIdsApi(Resource): - @api.expect(parser_ids) + @console_ns.expect(parser_ids) @setup_required @login_required @account_initialization_required @@ -112,7 +112,7 @@ parser_icon = ( @console_ns.route("/workspaces/current/plugin/icon") class PluginIconApi(Resource): - @api.expect(parser_icon) + @console_ns.expect(parser_icon) @setup_required def get(self): args = parser_icon.parse_args() @@ -181,7 +181,7 @@ parser_github = ( @console_ns.route("/workspaces/current/plugin/upload/github") class PluginUploadFromGithubApi(Resource): - @api.expect(parser_github) + @console_ns.expect(parser_github) @setup_required @login_required @account_initialization_required @@ -230,7 +230,7 @@ parser_pkg = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/plugin/install/pkg") class PluginInstallFromPkgApi(Resource): - @api.expect(parser_pkg) + @console_ns.expect(parser_pkg) @setup_required @login_required @account_initialization_required @@ -263,7 +263,7 @@ parser_githubapi = ( @console_ns.route("/workspaces/current/plugin/install/github") class PluginInstallFromGithubApi(Resource): - @api.expect(parser_githubapi) + @console_ns.expect(parser_githubapi) @setup_required @login_required @account_initialization_required @@ -294,7 +294,7 @@ parser_marketplace = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/plugin/install/marketplace") class PluginInstallFromMarketplaceApi(Resource): - @api.expect(parser_marketplace) + @console_ns.expect(parser_marketplace) @setup_required @login_required @account_initialization_required @@ -324,7 +324,7 @@ parser_pkgapi = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/plugin/marketplace/pkg") class PluginFetchMarketplacePkgApi(Resource): - @api.expect(parser_pkgapi) + @console_ns.expect(parser_pkgapi) @setup_required @login_required @account_initialization_required @@ -353,7 +353,7 @@ parser_fetch = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/plugin/fetch-manifest") class PluginFetchManifestApi(Resource): - @api.expect(parser_fetch) + @console_ns.expect(parser_fetch) @setup_required @login_required @account_initialization_required @@ -384,7 +384,7 @@ parser_tasks = ( @console_ns.route("/workspaces/current/plugin/tasks") class PluginFetchInstallTasksApi(Resource): - @api.expect(parser_tasks) + @console_ns.expect(parser_tasks) @setup_required @login_required @account_initialization_required @@ -471,7 +471,7 @@ parser_marketplace_api = ( @console_ns.route("/workspaces/current/plugin/upgrade/marketplace") class PluginUpgradeFromMarketplaceApi(Resource): - @api.expect(parser_marketplace_api) + @console_ns.expect(parser_marketplace_api) @setup_required @login_required @account_initialization_required @@ -503,7 +503,7 @@ parser_github_post = ( @console_ns.route("/workspaces/current/plugin/upgrade/github") class PluginUpgradeFromGithubApi(Resource): - @api.expect(parser_github_post) + @console_ns.expect(parser_github_post) @setup_required @login_required @account_initialization_required @@ -535,7 +535,7 @@ parser_uninstall = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/plugin/uninstall") class PluginUninstallApi(Resource): - @api.expect(parser_uninstall) + @console_ns.expect(parser_uninstall) @setup_required @login_required @account_initialization_required @@ -560,7 +560,7 @@ parser_change_post = ( @console_ns.route("/workspaces/current/plugin/permission/change") class PluginChangePermissionApi(Resource): - @api.expect(parser_change_post) + @console_ns.expect(parser_change_post) @setup_required @login_required @account_initialization_required @@ -618,7 +618,7 @@ parser_dynamic = ( @console_ns.route("/workspaces/current/plugin/parameters/dynamic-options") class PluginFetchDynamicSelectOptionsApi(Resource): - @api.expect(parser_dynamic) + @console_ns.expect(parser_dynamic) @setup_required @login_required @is_admin_or_owner_required @@ -655,7 +655,7 @@ parser_change = ( @console_ns.route("/workspaces/current/plugin/preferences/change") class PluginChangePreferencesApi(Resource): - @api.expect(parser_change) + @console_ns.expect(parser_change) @setup_required @login_required @account_initialization_required @@ -749,7 +749,7 @@ parser_exclude = reqparse.RequestParser().add_argument("plugin_id", type=str, re @console_ns.route("/workspaces/current/plugin/preferences/autoupgrade/exclude") class PluginAutoUpgradeExcludePluginApi(Resource): - @api.expect(parser_exclude) + @console_ns.expect(parser_exclude) @setup_required @login_required @account_initialization_required diff --git a/api/controllers/console/workspace/tool_providers.py b/api/controllers/console/workspace/tool_providers.py index 917059bb4c..2c54aa5a20 100644 --- a/api/controllers/console/workspace/tool_providers.py +++ b/api/controllers/console/workspace/tool_providers.py @@ -10,7 +10,7 @@ from sqlalchemy.orm import Session from werkzeug.exceptions import Forbidden from configs import dify_config -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.wraps import ( account_initialization_required, enterprise_license_required, @@ -65,7 +65,7 @@ parser_tool = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/tool-providers") class ToolProviderListApi(Resource): - @api.expect(parser_tool) + @console_ns.expect(parser_tool) @setup_required @login_required @account_initialization_required @@ -113,7 +113,7 @@ parser_delete = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/tool-provider/builtin//delete") class ToolBuiltinProviderDeleteApi(Resource): - @api.expect(parser_delete) + @console_ns.expect(parser_delete) @setup_required @login_required @is_admin_or_owner_required @@ -140,7 +140,7 @@ parser_add = ( @console_ns.route("/workspaces/current/tool-provider/builtin//add") class ToolBuiltinProviderAddApi(Resource): - @api.expect(parser_add) + @console_ns.expect(parser_add) @setup_required @login_required @account_initialization_required @@ -174,7 +174,7 @@ parser_update = ( @console_ns.route("/workspaces/current/tool-provider/builtin//update") class ToolBuiltinProviderUpdateApi(Resource): - @api.expect(parser_update) + @console_ns.expect(parser_update) @setup_required @login_required @is_admin_or_owner_required @@ -236,7 +236,7 @@ parser_api_add = ( @console_ns.route("/workspaces/current/tool-provider/api/add") class ToolApiProviderAddApi(Resource): - @api.expect(parser_api_add) + @console_ns.expect(parser_api_add) @setup_required @login_required @is_admin_or_owner_required @@ -267,7 +267,7 @@ parser_remote = reqparse.RequestParser().add_argument("url", type=str, required= @console_ns.route("/workspaces/current/tool-provider/api/remote") class ToolApiProviderGetRemoteSchemaApi(Resource): - @api.expect(parser_remote) + @console_ns.expect(parser_remote) @setup_required @login_required @account_initialization_required @@ -292,7 +292,7 @@ parser_tools = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/tool-provider/api/tools") class ToolApiProviderListToolsApi(Resource): - @api.expect(parser_tools) + @console_ns.expect(parser_tools) @setup_required @login_required @account_initialization_required @@ -328,7 +328,7 @@ parser_api_update = ( @console_ns.route("/workspaces/current/tool-provider/api/update") class ToolApiProviderUpdateApi(Resource): - @api.expect(parser_api_update) + @console_ns.expect(parser_api_update) @setup_required @login_required @is_admin_or_owner_required @@ -362,7 +362,7 @@ parser_api_delete = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/tool-provider/api/delete") class ToolApiProviderDeleteApi(Resource): - @api.expect(parser_api_delete) + @console_ns.expect(parser_api_delete) @setup_required @login_required @is_admin_or_owner_required @@ -386,7 +386,7 @@ parser_get = reqparse.RequestParser().add_argument("provider", type=str, require @console_ns.route("/workspaces/current/tool-provider/api/get") class ToolApiProviderGetApi(Resource): - @api.expect(parser_get) + @console_ns.expect(parser_get) @setup_required @login_required @account_initialization_required @@ -426,7 +426,7 @@ parser_schema = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/tool-provider/api/schema") class ToolApiProviderSchemaApi(Resource): - @api.expect(parser_schema) + @console_ns.expect(parser_schema) @setup_required @login_required @account_initialization_required @@ -451,7 +451,7 @@ parser_pre = ( @console_ns.route("/workspaces/current/tool-provider/api/test/pre") class ToolApiProviderPreviousTestApi(Resource): - @api.expect(parser_pre) + @console_ns.expect(parser_pre) @setup_required @login_required @account_initialization_required @@ -484,7 +484,7 @@ parser_create = ( @console_ns.route("/workspaces/current/tool-provider/workflow/create") class ToolWorkflowProviderCreateApi(Resource): - @api.expect(parser_create) + @console_ns.expect(parser_create) @setup_required @login_required @is_admin_or_owner_required @@ -525,7 +525,7 @@ parser_workflow_update = ( @console_ns.route("/workspaces/current/tool-provider/workflow/update") class ToolWorkflowProviderUpdateApi(Resource): - @api.expect(parser_workflow_update) + @console_ns.expect(parser_workflow_update) @setup_required @login_required @is_admin_or_owner_required @@ -560,7 +560,7 @@ parser_workflow_delete = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/tool-provider/workflow/delete") class ToolWorkflowProviderDeleteApi(Resource): - @api.expect(parser_workflow_delete) + @console_ns.expect(parser_workflow_delete) @setup_required @login_required @is_admin_or_owner_required @@ -588,7 +588,7 @@ parser_wf_get = ( @console_ns.route("/workspaces/current/tool-provider/workflow/get") class ToolWorkflowProviderGetApi(Resource): - @api.expect(parser_wf_get) + @console_ns.expect(parser_wf_get) @setup_required @login_required @account_initialization_required @@ -624,7 +624,7 @@ parser_wf_tools = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/tool-provider/workflow/tools") class ToolWorkflowProviderListToolApi(Resource): - @api.expect(parser_wf_tools) + @console_ns.expect(parser_wf_tools) @setup_required @login_required @account_initialization_required @@ -813,7 +813,7 @@ parser_default_cred = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/tool-provider/builtin//default-credential") class ToolBuiltinProviderSetDefaultApi(Resource): - @api.expect(parser_default_cred) + @console_ns.expect(parser_default_cred) @setup_required @login_required @account_initialization_required @@ -834,7 +834,7 @@ parser_custom = ( @console_ns.route("/workspaces/current/tool-provider/builtin//oauth/custom-client") class ToolOAuthCustomClient(Resource): - @api.expect(parser_custom) + @console_ns.expect(parser_custom) @setup_required @login_required @is_admin_or_owner_required @@ -932,7 +932,7 @@ parser_mcp_delete = reqparse.RequestParser().add_argument( @console_ns.route("/workspaces/current/tool-provider/mcp") class ToolProviderMCPApi(Resource): - @api.expect(parser_mcp) + @console_ns.expect(parser_mcp) @setup_required @login_required @account_initialization_required @@ -962,7 +962,7 @@ class ToolProviderMCPApi(Resource): ) return jsonable_encoder(result) - @api.expect(parser_mcp_put) + @console_ns.expect(parser_mcp_put) @setup_required @login_required @account_initialization_required @@ -1001,7 +1001,7 @@ class ToolProviderMCPApi(Resource): ) return {"result": "success"} - @api.expect(parser_mcp_delete) + @console_ns.expect(parser_mcp_delete) @setup_required @login_required @account_initialization_required @@ -1024,7 +1024,7 @@ parser_auth = ( @console_ns.route("/workspaces/current/tool-provider/mcp/auth") class ToolMCPAuthApi(Resource): - @api.expect(parser_auth) + @console_ns.expect(parser_auth) @setup_required @login_required @account_initialization_required @@ -1142,7 +1142,7 @@ parser_cb = ( @console_ns.route("/mcp/oauth/callback") class ToolMCPCallbackApi(Resource): - @api.expect(parser_cb) + @console_ns.expect(parser_cb) def get(self): args = parser_cb.parse_args() state_key = args["state"] diff --git a/api/controllers/console/workspace/trigger_providers.py b/api/controllers/console/workspace/trigger_providers.py index b2abae0b3d..1bcd80c1a5 100644 --- a/api/controllers/console/workspace/trigger_providers.py +++ b/api/controllers/console/workspace/trigger_providers.py @@ -6,7 +6,7 @@ from sqlalchemy.orm import Session from werkzeug.exceptions import BadRequest, Forbidden from configs import dify_config -from controllers.console import api +from controllers.console import console_ns from controllers.console.wraps import account_initialization_required, is_admin_or_owner_required, setup_required from controllers.web.error import NotFoundError from core.model_runtime.utils.encoders import jsonable_encoder @@ -539,45 +539,49 @@ class TriggerOAuthClientManageApi(Resource): # Trigger Subscription -api.add_resource(TriggerProviderIconApi, "/workspaces/current/trigger-provider//icon") -api.add_resource(TriggerProviderListApi, "/workspaces/current/triggers") -api.add_resource(TriggerProviderInfoApi, "/workspaces/current/trigger-provider//info") -api.add_resource(TriggerSubscriptionListApi, "/workspaces/current/trigger-provider//subscriptions/list") -api.add_resource( +console_ns.add_resource(TriggerProviderIconApi, "/workspaces/current/trigger-provider//icon") +console_ns.add_resource(TriggerProviderListApi, "/workspaces/current/triggers") +console_ns.add_resource(TriggerProviderInfoApi, "/workspaces/current/trigger-provider//info") +console_ns.add_resource( + TriggerSubscriptionListApi, "/workspaces/current/trigger-provider//subscriptions/list" +) +console_ns.add_resource( TriggerSubscriptionDeleteApi, "/workspaces/current/trigger-provider//subscriptions/delete", ) # Trigger Subscription Builder -api.add_resource( +console_ns.add_resource( TriggerSubscriptionBuilderCreateApi, "/workspaces/current/trigger-provider//subscriptions/builder/create", ) -api.add_resource( +console_ns.add_resource( TriggerSubscriptionBuilderGetApi, "/workspaces/current/trigger-provider//subscriptions/builder/", ) -api.add_resource( +console_ns.add_resource( TriggerSubscriptionBuilderUpdateApi, "/workspaces/current/trigger-provider//subscriptions/builder/update/", ) -api.add_resource( +console_ns.add_resource( TriggerSubscriptionBuilderVerifyApi, "/workspaces/current/trigger-provider//subscriptions/builder/verify/", ) -api.add_resource( +console_ns.add_resource( TriggerSubscriptionBuilderBuildApi, "/workspaces/current/trigger-provider//subscriptions/builder/build/", ) -api.add_resource( +console_ns.add_resource( TriggerSubscriptionBuilderLogsApi, "/workspaces/current/trigger-provider//subscriptions/builder/logs/", ) # OAuth -api.add_resource( +console_ns.add_resource( TriggerOAuthAuthorizeApi, "/workspaces/current/trigger-provider//subscriptions/oauth/authorize" ) -api.add_resource(TriggerOAuthCallbackApi, "/oauth/plugin//trigger/callback") -api.add_resource(TriggerOAuthClientManageApi, "/workspaces/current/trigger-provider//oauth/client") +console_ns.add_resource(TriggerOAuthCallbackApi, "/oauth/plugin//trigger/callback") +console_ns.add_resource( + TriggerOAuthClientManageApi, "/workspaces/current/trigger-provider//oauth/client" +) diff --git a/api/controllers/console/workspace/workspace.py b/api/controllers/console/workspace/workspace.py index 1548a18b90..37c7dc3040 100644 --- a/api/controllers/console/workspace/workspace.py +++ b/api/controllers/console/workspace/workspace.py @@ -13,7 +13,7 @@ from controllers.common.errors import ( TooManyFilesError, UnsupportedFileTypeError, ) -from controllers.console import api, console_ns +from controllers.console import console_ns from controllers.console.admin import admin_required from controllers.console.error import AccountNotLinkTenantError from controllers.console.wraps import ( @@ -155,7 +155,7 @@ parser_switch = reqparse.RequestParser().add_argument("tenant_id", type=str, req @console_ns.route("/workspaces/switch") class SwitchWorkspaceApi(Resource): - @api.expect(parser_switch) + @console_ns.expect(parser_switch) @setup_required @login_required @account_initialization_required @@ -250,7 +250,7 @@ parser_info = reqparse.RequestParser().add_argument("name", type=str, required=T @console_ns.route("/workspaces/info") class WorkspaceInfoApi(Resource): - @api.expect(parser_info) + @console_ns.expect(parser_info) @setup_required @login_required @account_initialization_required