| @@ -1,31 +1,10 @@ | |||
| from importlib import import_module | |||
| from flask import Blueprint | |||
| from flask_restx import Namespace | |||
| from libs.external_api import ExternalApi | |||
| from .app.app_import import AppImportApi, AppImportCheckDependenciesApi, AppImportConfirmApi | |||
| from .explore.audio import ChatAudioApi, ChatTextApi | |||
| from .explore.completion import ChatApi, ChatStopApi, CompletionApi, CompletionStopApi | |||
| from .explore.conversation import ( | |||
| ConversationApi, | |||
| ConversationListApi, | |||
| ConversationPinApi, | |||
| ConversationRenameApi, | |||
| ConversationUnPinApi, | |||
| ) | |||
| from .explore.message import ( | |||
| MessageFeedbackApi, | |||
| MessageListApi, | |||
| MessageMoreLikeThisApi, | |||
| MessageSuggestedQuestionApi, | |||
| ) | |||
| from .explore.workflow import ( | |||
| InstalledAppWorkflowRunApi, | |||
| InstalledAppWorkflowTaskStopApi, | |||
| ) | |||
| from .files import FileApi, FilePreviewApi, FileSupportTypeApi | |||
| from .remote_files import RemoteFileInfoApi, RemoteFileUploadApi | |||
| bp = Blueprint("console", __name__, url_prefix="/console/api") | |||
| api = ExternalApi( | |||
| @@ -35,23 +14,23 @@ api = ExternalApi( | |||
| description="Console management APIs for app configuration, monitoring, and administration", | |||
| ) | |||
| # Create namespace | |||
| console_ns = Namespace("console", description="Console management API operations", path="/") | |||
| # File | |||
| api.add_resource(FileApi, "/files/upload") | |||
| api.add_resource(FilePreviewApi, "/files/<uuid:file_id>/preview") | |||
| api.add_resource(FileSupportTypeApi, "/files/support-type") | |||
| # Remote files | |||
| api.add_resource(RemoteFileInfoApi, "/remote-files/<path:url>") | |||
| api.add_resource(RemoteFileUploadApi, "/remote-files/upload") | |||
| RESOURCE_MODULES = ( | |||
| "controllers.console.app.app_import", | |||
| "controllers.console.explore.audio", | |||
| "controllers.console.explore.completion", | |||
| "controllers.console.explore.conversation", | |||
| "controllers.console.explore.message", | |||
| "controllers.console.explore.workflow", | |||
| "controllers.console.files", | |||
| "controllers.console.remote_files", | |||
| ) | |||
| # Import App | |||
| api.add_resource(AppImportApi, "/apps/imports") | |||
| api.add_resource(AppImportConfirmApi, "/apps/imports/<string:import_id>/confirm") | |||
| api.add_resource(AppImportCheckDependenciesApi, "/apps/imports/<string:app_id>/check-dependencies") | |||
| for module_name in RESOURCE_MODULES: | |||
| import_module(module_name) | |||
| # Ensure resource modules are imported so route decorators are evaluated. | |||
| # Import other controllers | |||
| from . import ( | |||
| admin, | |||
| @@ -150,77 +129,6 @@ from .workspace import ( | |||
| workspace, | |||
| ) | |||
| # Explore Audio | |||
| api.add_resource(ChatAudioApi, "/installed-apps/<uuid:installed_app_id>/audio-to-text", endpoint="installed_app_audio") | |||
| api.add_resource(ChatTextApi, "/installed-apps/<uuid:installed_app_id>/text-to-audio", endpoint="installed_app_text") | |||
| # Explore Completion | |||
| api.add_resource( | |||
| CompletionApi, "/installed-apps/<uuid:installed_app_id>/completion-messages", endpoint="installed_app_completion" | |||
| ) | |||
| api.add_resource( | |||
| CompletionStopApi, | |||
| "/installed-apps/<uuid:installed_app_id>/completion-messages/<string:task_id>/stop", | |||
| endpoint="installed_app_stop_completion", | |||
| ) | |||
| api.add_resource( | |||
| ChatApi, "/installed-apps/<uuid:installed_app_id>/chat-messages", endpoint="installed_app_chat_completion" | |||
| ) | |||
| api.add_resource( | |||
| ChatStopApi, | |||
| "/installed-apps/<uuid:installed_app_id>/chat-messages/<string:task_id>/stop", | |||
| endpoint="installed_app_stop_chat_completion", | |||
| ) | |||
| # Explore Conversation | |||
| api.add_resource( | |||
| ConversationRenameApi, | |||
| "/installed-apps/<uuid:installed_app_id>/conversations/<uuid:c_id>/name", | |||
| endpoint="installed_app_conversation_rename", | |||
| ) | |||
| api.add_resource( | |||
| ConversationListApi, "/installed-apps/<uuid:installed_app_id>/conversations", endpoint="installed_app_conversations" | |||
| ) | |||
| api.add_resource( | |||
| ConversationApi, | |||
| "/installed-apps/<uuid:installed_app_id>/conversations/<uuid:c_id>", | |||
| endpoint="installed_app_conversation", | |||
| ) | |||
| api.add_resource( | |||
| ConversationPinApi, | |||
| "/installed-apps/<uuid:installed_app_id>/conversations/<uuid:c_id>/pin", | |||
| endpoint="installed_app_conversation_pin", | |||
| ) | |||
| api.add_resource( | |||
| ConversationUnPinApi, | |||
| "/installed-apps/<uuid:installed_app_id>/conversations/<uuid:c_id>/unpin", | |||
| endpoint="installed_app_conversation_unpin", | |||
| ) | |||
| # Explore Message | |||
| api.add_resource(MessageListApi, "/installed-apps/<uuid:installed_app_id>/messages", endpoint="installed_app_messages") | |||
| api.add_resource( | |||
| MessageFeedbackApi, | |||
| "/installed-apps/<uuid:installed_app_id>/messages/<uuid:message_id>/feedbacks", | |||
| endpoint="installed_app_message_feedback", | |||
| ) | |||
| api.add_resource( | |||
| MessageMoreLikeThisApi, | |||
| "/installed-apps/<uuid:installed_app_id>/messages/<uuid:message_id>/more-like-this", | |||
| endpoint="installed_app_more_like_this", | |||
| ) | |||
| api.add_resource( | |||
| MessageSuggestedQuestionApi, | |||
| "/installed-apps/<uuid:installed_app_id>/messages/<uuid:message_id>/suggested-questions", | |||
| endpoint="installed_app_suggested_question", | |||
| ) | |||
| # Explore Workflow | |||
| api.add_resource(InstalledAppWorkflowRunApi, "/installed-apps/<uuid:installed_app_id>/workflows/run") | |||
| api.add_resource( | |||
| InstalledAppWorkflowTaskStopApi, "/installed-apps/<uuid:installed_app_id>/workflows/tasks/<string:task_id>/stop" | |||
| ) | |||
| api.add_namespace(console_ns) | |||
| __all__ = [ | |||
| @@ -20,7 +20,10 @@ from services.app_dsl_service import AppDslService, ImportStatus | |||
| from services.enterprise.enterprise_service import EnterpriseService | |||
| from services.feature_service import FeatureService | |||
| from .. import console_ns | |||
| @console_ns.route("/apps/imports") | |||
| class AppImportApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -74,6 +77,7 @@ class AppImportApi(Resource): | |||
| return result.model_dump(mode="json"), 200 | |||
| @console_ns.route("/apps/imports/<string:import_id>/confirm") | |||
| class AppImportConfirmApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -98,6 +102,7 @@ class AppImportConfirmApi(Resource): | |||
| return result.model_dump(mode="json"), 200 | |||
| @console_ns.route("/apps/imports/<string:app_id>/check-dependencies") | |||
| class AppImportCheckDependenciesApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -2,7 +2,7 @@ from flask_login import current_user | |||
| from flask_restx import Resource, reqparse | |||
| from werkzeug.exceptions import Forbidden | |||
| from controllers.console import api | |||
| from controllers.console import console_ns | |||
| from controllers.console.auth.error import ApiKeyAuthFailedError | |||
| from libs.login import login_required | |||
| from services.auth.api_key_auth_service import ApiKeyAuthService | |||
| @@ -10,6 +10,7 @@ from services.auth.api_key_auth_service import ApiKeyAuthService | |||
| from ..wraps import account_initialization_required, setup_required | |||
| @console_ns.route("/api-key-auth/data-source") | |||
| class ApiKeyAuthDataSource(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -33,6 +34,7 @@ class ApiKeyAuthDataSource(Resource): | |||
| return {"sources": []} | |||
| @console_ns.route("/api-key-auth/data-source/binding") | |||
| class ApiKeyAuthDataSourceBinding(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -54,6 +56,7 @@ class ApiKeyAuthDataSourceBinding(Resource): | |||
| return {"result": "success"}, 200 | |||
| @console_ns.route("/api-key-auth/data-source/<uuid:binding_id>") | |||
| class ApiKeyAuthDataSourceBindingDelete(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -66,8 +69,3 @@ class ApiKeyAuthDataSourceBindingDelete(Resource): | |||
| ApiKeyAuthService.delete_provider_auth(current_user.current_tenant_id, binding_id) | |||
| return {"result": "success"}, 204 | |||
| api.add_resource(ApiKeyAuthDataSource, "/api-key-auth/data-source") | |||
| api.add_resource(ApiKeyAuthDataSourceBinding, "/api-key-auth/data-source/binding") | |||
| api.add_resource(ApiKeyAuthDataSourceBindingDelete, "/api-key-auth/data-source/<uuid:binding_id>") | |||
| @@ -5,7 +5,7 @@ from sqlalchemy.orm import Session | |||
| from configs import dify_config | |||
| from constants.languages import languages | |||
| from controllers.console import api | |||
| from controllers.console import console_ns | |||
| from controllers.console.auth.error import ( | |||
| EmailAlreadyInUseError, | |||
| EmailCodeError, | |||
| @@ -25,6 +25,7 @@ from services.billing_service import BillingService | |||
| from services.errors.account import AccountNotFoundError, AccountRegisterError | |||
| @console_ns.route("/email-register/send-email") | |||
| class EmailRegisterSendEmailApi(Resource): | |||
| @setup_required | |||
| @email_password_login_enabled | |||
| @@ -52,6 +53,7 @@ class EmailRegisterSendEmailApi(Resource): | |||
| return {"result": "success", "data": token} | |||
| @console_ns.route("/email-register/validity") | |||
| class EmailRegisterCheckApi(Resource): | |||
| @setup_required | |||
| @email_password_login_enabled | |||
| @@ -92,6 +94,7 @@ class EmailRegisterCheckApi(Resource): | |||
| return {"is_valid": True, "email": token_data.get("email"), "token": new_token} | |||
| @console_ns.route("/email-register") | |||
| class EmailRegisterResetApi(Resource): | |||
| @setup_required | |||
| @email_password_login_enabled | |||
| @@ -148,8 +151,3 @@ class EmailRegisterResetApi(Resource): | |||
| raise AccountInFreezeError() | |||
| return account | |||
| api.add_resource(EmailRegisterSendEmailApi, "/email-register/send-email") | |||
| api.add_resource(EmailRegisterCheckApi, "/email-register/validity") | |||
| api.add_resource(EmailRegisterResetApi, "/email-register") | |||
| @@ -221,8 +221,3 @@ class ForgotPasswordResetApi(Resource): | |||
| TenantService.create_tenant_member(tenant, account, role="owner") | |||
| account.current_tenant = tenant | |||
| tenant_was_created.send(tenant) | |||
| api.add_resource(ForgotPasswordSendEmailApi, "/forgot-password") | |||
| api.add_resource(ForgotPasswordCheckApi, "/forgot-password/validity") | |||
| api.add_resource(ForgotPasswordResetApi, "/forgot-password/resets") | |||
| @@ -7,7 +7,7 @@ from flask_restx import Resource, reqparse | |||
| import services | |||
| from configs import dify_config | |||
| from constants.languages import languages | |||
| from controllers.console import api | |||
| from controllers.console import console_ns | |||
| from controllers.console.auth.error import ( | |||
| AuthenticationFailedError, | |||
| EmailCodeError, | |||
| @@ -34,6 +34,7 @@ from services.errors.workspace import WorkSpaceNotAllowedCreateError, Workspaces | |||
| from services.feature_service import FeatureService | |||
| @console_ns.route("/login") | |||
| class LoginApi(Resource): | |||
| """Resource for user login.""" | |||
| @@ -91,6 +92,7 @@ class LoginApi(Resource): | |||
| return {"result": "success", "data": token_pair.model_dump()} | |||
| @console_ns.route("/logout") | |||
| class LogoutApi(Resource): | |||
| @setup_required | |||
| def get(self): | |||
| @@ -102,6 +104,7 @@ class LogoutApi(Resource): | |||
| return {"result": "success"} | |||
| @console_ns.route("/reset-password") | |||
| class ResetPasswordSendEmailApi(Resource): | |||
| @setup_required | |||
| @email_password_login_enabled | |||
| @@ -130,6 +133,7 @@ class ResetPasswordSendEmailApi(Resource): | |||
| return {"result": "success", "data": token} | |||
| @console_ns.route("/email-code-login") | |||
| class EmailCodeLoginSendEmailApi(Resource): | |||
| @setup_required | |||
| def post(self): | |||
| @@ -162,6 +166,7 @@ class EmailCodeLoginSendEmailApi(Resource): | |||
| return {"result": "success", "data": token} | |||
| @console_ns.route("/email-code-login/validity") | |||
| class EmailCodeLoginApi(Resource): | |||
| @setup_required | |||
| def post(self): | |||
| @@ -218,6 +223,7 @@ class EmailCodeLoginApi(Resource): | |||
| return {"result": "success", "data": token_pair.model_dump()} | |||
| @console_ns.route("/refresh-token") | |||
| class RefreshTokenApi(Resource): | |||
| def post(self): | |||
| parser = reqparse.RequestParser() | |||
| @@ -229,11 +235,3 @@ class RefreshTokenApi(Resource): | |||
| return {"result": "success", "data": new_token_pair.model_dump()} | |||
| except Exception as e: | |||
| return {"result": "fail", "data": str(e)}, 401 | |||
| api.add_resource(LoginApi, "/login") | |||
| api.add_resource(LogoutApi, "/logout") | |||
| api.add_resource(EmailCodeLoginSendEmailApi, "/email-code-login") | |||
| api.add_resource(EmailCodeLoginApi, "/email-code-login/validity") | |||
| api.add_resource(ResetPasswordSendEmailApi, "/reset-password") | |||
| api.add_resource(RefreshTokenApi, "/refresh-token") | |||
| @@ -14,7 +14,7 @@ from models.account import Account | |||
| from models.model import OAuthProviderApp | |||
| from services.oauth_server import OAUTH_ACCESS_TOKEN_EXPIRES_IN, OAuthGrantType, OAuthServerService | |||
| from .. import api | |||
| from .. import console_ns | |||
| P = ParamSpec("P") | |||
| R = TypeVar("R") | |||
| @@ -86,6 +86,7 @@ def oauth_server_access_token_required(view: Callable[Concatenate[T, OAuthProvid | |||
| return decorated | |||
| @console_ns.route("/oauth/provider") | |||
| class OAuthServerAppApi(Resource): | |||
| @setup_required | |||
| @oauth_server_client_id_required | |||
| @@ -108,6 +109,7 @@ class OAuthServerAppApi(Resource): | |||
| ) | |||
| @console_ns.route("/oauth/provider/authorize") | |||
| class OAuthServerUserAuthorizeApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -125,6 +127,7 @@ class OAuthServerUserAuthorizeApi(Resource): | |||
| ) | |||
| @console_ns.route("/oauth/provider/token") | |||
| class OAuthServerUserTokenApi(Resource): | |||
| @setup_required | |||
| @oauth_server_client_id_required | |||
| @@ -180,6 +183,7 @@ class OAuthServerUserTokenApi(Resource): | |||
| ) | |||
| @console_ns.route("/oauth/provider/account") | |||
| class OAuthServerUserAccountApi(Resource): | |||
| @setup_required | |||
| @oauth_server_client_id_required | |||
| @@ -194,9 +198,3 @@ class OAuthServerUserAccountApi(Resource): | |||
| "timezone": account.timezone, | |||
| } | |||
| ) | |||
| api.add_resource(OAuthServerAppApi, "/oauth/provider") | |||
| api.add_resource(OAuthServerUserAuthorizeApi, "/oauth/provider/authorize") | |||
| api.add_resource(OAuthServerUserTokenApi, "/oauth/provider/token") | |||
| api.add_resource(OAuthServerUserAccountApi, "/oauth/provider/account") | |||
| @@ -1,12 +1,13 @@ | |||
| from flask_restx import Resource, reqparse | |||
| from controllers.console import api | |||
| from controllers.console import console_ns | |||
| from controllers.console.wraps import account_initialization_required, only_edition_cloud, setup_required | |||
| from libs.login import current_user, login_required | |||
| from models.model import Account | |||
| from services.billing_service import BillingService | |||
| @console_ns.route("/billing/subscription") | |||
| class Subscription(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -26,6 +27,7 @@ class Subscription(Resource): | |||
| ) | |||
| @console_ns.route("/billing/invoices") | |||
| class Invoices(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -36,7 +38,3 @@ class Invoices(Resource): | |||
| BillingService.is_tenant_owner_or_admin(current_user) | |||
| assert current_user.current_tenant_id is not None | |||
| return BillingService.get_invoices(current_user.email, current_user.current_tenant_id) | |||
| api.add_resource(Subscription, "/billing/subscription") | |||
| api.add_resource(Invoices, "/billing/invoices") | |||
| @@ -6,10 +6,11 @@ from libs.helper import extract_remote_ip | |||
| from libs.login import login_required | |||
| from services.billing_service import BillingService | |||
| from .. import api | |||
| from .. import console_ns | |||
| from ..wraps import account_initialization_required, only_edition_cloud, setup_required | |||
| @console_ns.route("/compliance/download") | |||
| class ComplianceApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -30,6 +31,3 @@ class ComplianceApi(Resource): | |||
| ip=ip_address, | |||
| device_info=device_info, | |||
| ) | |||
| api.add_resource(ComplianceApi, "/compliance/download") | |||
| @@ -9,7 +9,7 @@ from sqlalchemy import select | |||
| from sqlalchemy.orm import Session | |||
| from werkzeug.exceptions import NotFound | |||
| from controllers.console import api | |||
| from controllers.console import console_ns | |||
| from controllers.console.wraps import account_initialization_required, setup_required | |||
| from core.datasource.entities.datasource_entities import DatasourceProviderType, OnlineDocumentPagesMessage | |||
| from core.datasource.online_document.online_document_plugin import OnlineDocumentDatasourcePlugin | |||
| @@ -27,6 +27,10 @@ from services.datasource_provider_service import DatasourceProviderService | |||
| from tasks.document_indexing_sync_task import document_indexing_sync_task | |||
| @console_ns.route( | |||
| "/data-source/integrates", | |||
| "/data-source/integrates/<uuid:binding_id>/<string:action>", | |||
| ) | |||
| class DataSourceApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -109,6 +113,7 @@ class DataSourceApi(Resource): | |||
| return {"result": "success"}, 200 | |||
| @console_ns.route("/notion/pre-import/pages") | |||
| class DataSourceNotionListApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -196,6 +201,10 @@ class DataSourceNotionListApi(Resource): | |||
| return {"notion_info": {**workspace_info, "pages": pages}}, 200 | |||
| @console_ns.route( | |||
| "/notion/workspaces/<uuid:workspace_id>/pages/<uuid:page_id>/<string:page_type>/preview", | |||
| "/datasets/notion-indexing-estimate", | |||
| ) | |||
| class DataSourceNotionApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -269,6 +278,7 @@ class DataSourceNotionApi(Resource): | |||
| return response.model_dump(), 200 | |||
| @console_ns.route("/datasets/<uuid:dataset_id>/notion/sync") | |||
| class DataSourceNotionDatasetSyncApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -285,6 +295,7 @@ class DataSourceNotionDatasetSyncApi(Resource): | |||
| return {"result": "success"}, 200 | |||
| @console_ns.route("/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/notion/sync") | |||
| class DataSourceNotionDocumentSyncApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -301,16 +312,3 @@ class DataSourceNotionDocumentSyncApi(Resource): | |||
| raise NotFound("Document not found.") | |||
| document_indexing_sync_task.delay(dataset_id_str, document_id_str) | |||
| return {"result": "success"}, 200 | |||
| api.add_resource(DataSourceApi, "/data-source/integrates", "/data-source/integrates/<uuid:binding_id>/<string:action>") | |||
| api.add_resource(DataSourceNotionListApi, "/notion/pre-import/pages") | |||
| api.add_resource( | |||
| DataSourceNotionApi, | |||
| "/notion/workspaces/<uuid:workspace_id>/pages/<uuid:page_id>/<string:page_type>/preview", | |||
| "/datasets/notion-indexing-estimate", | |||
| ) | |||
| api.add_resource(DataSourceNotionDatasetSyncApi, "/datasets/<uuid:dataset_id>/notion/sync") | |||
| api.add_resource( | |||
| DataSourceNotionDocumentSyncApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/notion/sync" | |||
| ) | |||
| @@ -1114,6 +1114,7 @@ class WebsiteDocumentSyncApi(DocumentResource): | |||
| return {"result": "success"}, 200 | |||
| @console_ns.route("/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/pipeline-execution-log") | |||
| class DocumentPipelineExecutionLogApi(DocumentResource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -1147,29 +1148,3 @@ class DocumentPipelineExecutionLogApi(DocumentResource): | |||
| "input_data": log.input_data, | |||
| "datasource_node_id": log.datasource_node_id, | |||
| }, 200 | |||
| api.add_resource(GetProcessRuleApi, "/datasets/process-rule") | |||
| api.add_resource(DatasetDocumentListApi, "/datasets/<uuid:dataset_id>/documents") | |||
| api.add_resource(DatasetInitApi, "/datasets/init") | |||
| api.add_resource( | |||
| DocumentIndexingEstimateApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/indexing-estimate" | |||
| ) | |||
| api.add_resource(DocumentBatchIndexingEstimateApi, "/datasets/<uuid:dataset_id>/batch/<string:batch>/indexing-estimate") | |||
| api.add_resource(DocumentBatchIndexingStatusApi, "/datasets/<uuid:dataset_id>/batch/<string:batch>/indexing-status") | |||
| api.add_resource(DocumentIndexingStatusApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/indexing-status") | |||
| api.add_resource(DocumentApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>") | |||
| api.add_resource( | |||
| DocumentProcessingApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/processing/<string:action>" | |||
| ) | |||
| api.add_resource(DocumentMetadataApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/metadata") | |||
| api.add_resource(DocumentStatusApi, "/datasets/<uuid:dataset_id>/documents/status/<string:action>/batch") | |||
| api.add_resource(DocumentPauseApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/processing/pause") | |||
| api.add_resource(DocumentRecoverApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/processing/resume") | |||
| api.add_resource(DocumentRetryApi, "/datasets/<uuid:dataset_id>/retry") | |||
| api.add_resource(DocumentRenameApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/rename") | |||
| api.add_resource(WebsiteDocumentSyncApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/website-sync") | |||
| api.add_resource( | |||
| DocumentPipelineExecutionLogApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/pipeline-execution-log" | |||
| ) | |||
| @@ -7,7 +7,7 @@ from sqlalchemy import select | |||
| from werkzeug.exceptions import Forbidden, NotFound | |||
| import services | |||
| from controllers.console import api | |||
| from controllers.console import console_ns | |||
| from controllers.console.app.error import ProviderNotInitializeError | |||
| from controllers.console.datasets.error import ( | |||
| ChildChunkDeleteIndexError, | |||
| @@ -37,6 +37,7 @@ from services.errors.chunk import ChildChunkIndexingError as ChildChunkIndexingS | |||
| from tasks.batch_create_segment_to_index_task import batch_create_segment_to_index_task | |||
| @console_ns.route("/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/segments") | |||
| class DatasetDocumentSegmentListApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -139,6 +140,7 @@ class DatasetDocumentSegmentListApi(Resource): | |||
| return {"result": "success"}, 204 | |||
| @console_ns.route("/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/segment/<string:action>") | |||
| class DatasetDocumentSegmentApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -193,6 +195,7 @@ class DatasetDocumentSegmentApi(Resource): | |||
| return {"result": "success"}, 200 | |||
| @console_ns.route("/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/segment") | |||
| class DatasetDocumentSegmentAddApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -244,6 +247,7 @@ class DatasetDocumentSegmentAddApi(Resource): | |||
| return {"data": marshal(segment, segment_fields), "doc_form": document.doc_form}, 200 | |||
| @console_ns.route("/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/segments/<uuid:segment_id>") | |||
| class DatasetDocumentSegmentUpdateApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -345,6 +349,10 @@ class DatasetDocumentSegmentUpdateApi(Resource): | |||
| return {"result": "success"}, 204 | |||
| @console_ns.route( | |||
| "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/segments/batch_import", | |||
| "/datasets/batch_import_status/<uuid:job_id>", | |||
| ) | |||
| class DatasetDocumentSegmentBatchImportApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -393,7 +401,9 @@ class DatasetDocumentSegmentBatchImportApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @account_initialization_required | |||
| def get(self, job_id): | |||
| def get(self, job_id=None, dataset_id=None, document_id=None): | |||
| if job_id is None: | |||
| raise NotFound("The job does not exist.") | |||
| job_id = str(job_id) | |||
| indexing_cache_key = f"segment_batch_import_{job_id}" | |||
| cache_result = redis_client.get(indexing_cache_key) | |||
| @@ -403,6 +413,7 @@ class DatasetDocumentSegmentBatchImportApi(Resource): | |||
| return {"job_id": job_id, "job_status": cache_result.decode()}, 200 | |||
| @console_ns.route("/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/segments/<uuid:segment_id>/child_chunks") | |||
| class ChildChunkAddApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -553,6 +564,9 @@ class ChildChunkAddApi(Resource): | |||
| return {"data": marshal(child_chunks, child_chunk_fields)}, 200 | |||
| @console_ns.route( | |||
| "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/segments/<uuid:segment_id>/child_chunks/<uuid:child_chunk_id>" | |||
| ) | |||
| class ChildChunkUpdateApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -666,27 +680,3 @@ class ChildChunkUpdateApi(Resource): | |||
| except ChildChunkIndexingServiceError as e: | |||
| raise ChildChunkIndexingError(str(e)) | |||
| return {"data": marshal(child_chunk, child_chunk_fields)}, 200 | |||
| api.add_resource(DatasetDocumentSegmentListApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/segments") | |||
| api.add_resource( | |||
| DatasetDocumentSegmentApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/segment/<string:action>" | |||
| ) | |||
| api.add_resource(DatasetDocumentSegmentAddApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/segment") | |||
| api.add_resource( | |||
| DatasetDocumentSegmentUpdateApi, | |||
| "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/segments/<uuid:segment_id>", | |||
| ) | |||
| api.add_resource( | |||
| DatasetDocumentSegmentBatchImportApi, | |||
| "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/segments/batch_import", | |||
| "/datasets/batch_import_status/<uuid:job_id>", | |||
| ) | |||
| api.add_resource( | |||
| ChildChunkAddApi, | |||
| "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/segments/<uuid:segment_id>/child_chunks", | |||
| ) | |||
| api.add_resource( | |||
| ChildChunkUpdateApi, | |||
| "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/segments/<uuid:segment_id>/child_chunks/<uuid:child_chunk_id>", | |||
| ) | |||
| @@ -4,7 +4,7 @@ from flask_login import current_user | |||
| from flask_restx import Resource, marshal_with, reqparse | |||
| from werkzeug.exceptions import NotFound | |||
| from controllers.console import api | |||
| from controllers.console import console_ns | |||
| from controllers.console.wraps import account_initialization_required, enterprise_license_required, setup_required | |||
| from fields.dataset_fields import dataset_metadata_fields | |||
| from libs.login import login_required | |||
| @@ -16,6 +16,7 @@ from services.entities.knowledge_entities.knowledge_entities import ( | |||
| from services.metadata_service import MetadataService | |||
| @console_ns.route("/datasets/<uuid:dataset_id>/metadata") | |||
| class DatasetMetadataCreateApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -50,6 +51,7 @@ class DatasetMetadataCreateApi(Resource): | |||
| return MetadataService.get_dataset_metadatas(dataset), 200 | |||
| @console_ns.route("/datasets/<uuid:dataset_id>/metadata/<uuid:metadata_id>") | |||
| class DatasetMetadataApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -87,6 +89,7 @@ class DatasetMetadataApi(Resource): | |||
| return {"result": "success"}, 204 | |||
| @console_ns.route("/datasets/metadata/built-in") | |||
| class DatasetMetadataBuiltInFieldApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -97,6 +100,7 @@ class DatasetMetadataBuiltInFieldApi(Resource): | |||
| return {"fields": built_in_fields}, 200 | |||
| @console_ns.route("/datasets/<uuid:dataset_id>/metadata/built-in/<string:action>") | |||
| class DatasetMetadataBuiltInFieldActionApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -116,6 +120,7 @@ class DatasetMetadataBuiltInFieldActionApi(Resource): | |||
| return {"result": "success"}, 200 | |||
| @console_ns.route("/datasets/<uuid:dataset_id>/documents/metadata") | |||
| class DocumentMetadataEditApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -136,10 +141,3 @@ class DocumentMetadataEditApi(Resource): | |||
| MetadataService.update_documents_metadata(dataset, metadata_args) | |||
| return {"result": "success"}, 200 | |||
| api.add_resource(DatasetMetadataCreateApi, "/datasets/<uuid:dataset_id>/metadata") | |||
| api.add_resource(DatasetMetadataApi, "/datasets/<uuid:dataset_id>/metadata/<uuid:metadata_id>") | |||
| api.add_resource(DatasetMetadataBuiltInFieldApi, "/datasets/metadata/built-in") | |||
| api.add_resource(DatasetMetadataBuiltInFieldActionApi, "/datasets/<uuid:dataset_id>/metadata/built-in/<string:action>") | |||
| api.add_resource(DocumentMetadataEditApi, "/datasets/<uuid:dataset_id>/documents/metadata") | |||
| @@ -5,7 +5,7 @@ from flask_restx import Resource, reqparse | |||
| from werkzeug.exceptions import Forbidden, NotFound | |||
| from configs import dify_config | |||
| from controllers.console import api | |||
| from controllers.console import console_ns | |||
| from controllers.console.wraps import ( | |||
| account_initialization_required, | |||
| setup_required, | |||
| @@ -19,6 +19,7 @@ from services.datasource_provider_service import DatasourceProviderService | |||
| from services.plugin.oauth_service import OAuthProxyService | |||
| @console_ns.route("/oauth/plugin/<path:provider_id>/datasource/get-authorization-url") | |||
| class DatasourcePluginOAuthAuthorizationUrl(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -68,6 +69,7 @@ class DatasourcePluginOAuthAuthorizationUrl(Resource): | |||
| return response | |||
| @console_ns.route("/oauth/plugin/<path:provider_id>/datasource/callback") | |||
| class DatasourceOAuthCallback(Resource): | |||
| @setup_required | |||
| def get(self, provider_id: str): | |||
| @@ -123,6 +125,7 @@ class DatasourceOAuthCallback(Resource): | |||
| return redirect(f"{dify_config.CONSOLE_WEB_URL}/oauth-callback") | |||
| @console_ns.route("/auth/plugin/datasource/<path:provider_id>") | |||
| class DatasourceAuth(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -165,6 +168,7 @@ class DatasourceAuth(Resource): | |||
| return {"result": datasources}, 200 | |||
| @console_ns.route("/auth/plugin/datasource/<path:provider_id>/delete") | |||
| class DatasourceAuthDeleteApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -188,6 +192,7 @@ class DatasourceAuthDeleteApi(Resource): | |||
| return {"result": "success"}, 200 | |||
| @console_ns.route("/auth/plugin/datasource/<path:provider_id>/update") | |||
| class DatasourceAuthUpdateApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -213,6 +218,7 @@ class DatasourceAuthUpdateApi(Resource): | |||
| return {"result": "success"}, 201 | |||
| @console_ns.route("/auth/plugin/datasource/list") | |||
| class DatasourceAuthListApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -225,6 +231,7 @@ class DatasourceAuthListApi(Resource): | |||
| return {"result": jsonable_encoder(datasources)}, 200 | |||
| @console_ns.route("/auth/plugin/datasource/default-list") | |||
| class DatasourceHardCodeAuthListApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -237,6 +244,7 @@ class DatasourceHardCodeAuthListApi(Resource): | |||
| return {"result": jsonable_encoder(datasources)}, 200 | |||
| @console_ns.route("/auth/plugin/datasource/<path:provider_id>/custom-client") | |||
| class DatasourceAuthOauthCustomClient(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -271,6 +279,7 @@ class DatasourceAuthOauthCustomClient(Resource): | |||
| return {"result": "success"}, 200 | |||
| @console_ns.route("/auth/plugin/datasource/<path:provider_id>/default") | |||
| class DatasourceAuthDefaultApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -291,6 +300,7 @@ class DatasourceAuthDefaultApi(Resource): | |||
| return {"result": "success"}, 200 | |||
| @console_ns.route("/auth/plugin/datasource/<path:provider_id>/update-name") | |||
| class DatasourceUpdateProviderNameApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -311,52 +321,3 @@ class DatasourceUpdateProviderNameApi(Resource): | |||
| credential_id=args["credential_id"], | |||
| ) | |||
| return {"result": "success"}, 200 | |||
| api.add_resource( | |||
| DatasourcePluginOAuthAuthorizationUrl, | |||
| "/oauth/plugin/<path:provider_id>/datasource/get-authorization-url", | |||
| ) | |||
| api.add_resource( | |||
| DatasourceOAuthCallback, | |||
| "/oauth/plugin/<path:provider_id>/datasource/callback", | |||
| ) | |||
| api.add_resource( | |||
| DatasourceAuth, | |||
| "/auth/plugin/datasource/<path:provider_id>", | |||
| ) | |||
| api.add_resource( | |||
| DatasourceAuthUpdateApi, | |||
| "/auth/plugin/datasource/<path:provider_id>/update", | |||
| ) | |||
| api.add_resource( | |||
| DatasourceAuthDeleteApi, | |||
| "/auth/plugin/datasource/<path:provider_id>/delete", | |||
| ) | |||
| api.add_resource( | |||
| DatasourceAuthListApi, | |||
| "/auth/plugin/datasource/list", | |||
| ) | |||
| api.add_resource( | |||
| DatasourceHardCodeAuthListApi, | |||
| "/auth/plugin/datasource/default-list", | |||
| ) | |||
| api.add_resource( | |||
| DatasourceAuthOauthCustomClient, | |||
| "/auth/plugin/datasource/<path:provider_id>/custom-client", | |||
| ) | |||
| api.add_resource( | |||
| DatasourceAuthDefaultApi, | |||
| "/auth/plugin/datasource/<path:provider_id>/default", | |||
| ) | |||
| api.add_resource( | |||
| DatasourceUpdateProviderNameApi, | |||
| "/auth/plugin/datasource/<path:provider_id>/update-name", | |||
| ) | |||
| @@ -4,7 +4,7 @@ from flask_restx import ( # type: ignore | |||
| ) | |||
| from werkzeug.exceptions import Forbidden | |||
| from controllers.console import api | |||
| 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 | |||
| @@ -13,6 +13,7 @@ from models.dataset import Pipeline | |||
| from services.rag_pipeline.rag_pipeline import RagPipelineService | |||
| @console_ns.route("/rag/pipelines/<uuid:pipeline_id>/workflows/published/datasource/nodes/<string:node_id>/preview") | |||
| class DataSourceContentPreviewApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -49,9 +50,3 @@ class DataSourceContentPreviewApi(Resource): | |||
| credential_id=args.get("credential_id"), | |||
| ) | |||
| return preview_content, 200 | |||
| api.add_resource( | |||
| DataSourceContentPreviewApi, | |||
| "/rag/pipelines/<uuid:pipeline_id>/workflows/published/datasource/nodes/<string:node_id>/preview", | |||
| ) | |||
| @@ -4,7 +4,7 @@ from flask import request | |||
| from flask_restx import Resource, reqparse | |||
| from sqlalchemy.orm import Session | |||
| from controllers.console import api | |||
| from controllers.console import console_ns | |||
| from controllers.console.wraps import ( | |||
| account_initialization_required, | |||
| enterprise_license_required, | |||
| @@ -32,6 +32,7 @@ def _validate_description_length(description): | |||
| return description | |||
| @console_ns.route("/rag/pipeline/templates") | |||
| class PipelineTemplateListApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -45,6 +46,7 @@ class PipelineTemplateListApi(Resource): | |||
| return pipeline_templates, 200 | |||
| @console_ns.route("/rag/pipeline/templates/<string:template_id>") | |||
| class PipelineTemplateDetailApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -57,6 +59,7 @@ class PipelineTemplateDetailApi(Resource): | |||
| return pipeline_template, 200 | |||
| @console_ns.route("/rag/pipeline/customized/templates/<string:template_id>") | |||
| class CustomizedPipelineTemplateApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -112,6 +115,7 @@ class CustomizedPipelineTemplateApi(Resource): | |||
| return {"data": template.yaml_content}, 200 | |||
| @console_ns.route("/rag/pipelines/<string:pipeline_id>/customized/publish") | |||
| class PublishCustomizedPipelineTemplateApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -144,21 +148,3 @@ class PublishCustomizedPipelineTemplateApi(Resource): | |||
| rag_pipeline_service = RagPipelineService() | |||
| rag_pipeline_service.publish_customized_pipeline_template(pipeline_id, args) | |||
| return {"result": "success"} | |||
| api.add_resource( | |||
| PipelineTemplateListApi, | |||
| "/rag/pipeline/templates", | |||
| ) | |||
| api.add_resource( | |||
| PipelineTemplateDetailApi, | |||
| "/rag/pipeline/templates/<string:template_id>", | |||
| ) | |||
| api.add_resource( | |||
| CustomizedPipelineTemplateApi, | |||
| "/rag/pipeline/customized/templates/<string:template_id>", | |||
| ) | |||
| api.add_resource( | |||
| PublishCustomizedPipelineTemplateApi, | |||
| "/rag/pipelines/<string:pipeline_id>/customized/publish", | |||
| ) | |||
| @@ -26,9 +26,15 @@ from services.errors.audio import ( | |||
| UnsupportedAudioTypeServiceError, | |||
| ) | |||
| from .. import console_ns | |||
| logger = logging.getLogger(__name__) | |||
| @console_ns.route( | |||
| "/installed-apps/<uuid:installed_app_id>/audio-to-text", | |||
| endpoint="installed_app_audio", | |||
| ) | |||
| class ChatAudioApi(InstalledAppResource): | |||
| def post(self, installed_app): | |||
| app_model = installed_app.app | |||
| @@ -65,6 +71,10 @@ class ChatAudioApi(InstalledAppResource): | |||
| raise InternalServerError() | |||
| @console_ns.route( | |||
| "/installed-apps/<uuid:installed_app_id>/text-to-audio", | |||
| endpoint="installed_app_text", | |||
| ) | |||
| class ChatTextApi(InstalledAppResource): | |||
| def post(self, installed_app): | |||
| from flask_restx import reqparse | |||
| @@ -33,10 +33,16 @@ from models.model import AppMode | |||
| from services.app_generate_service import AppGenerateService | |||
| from services.errors.llm import InvokeRateLimitError | |||
| from .. import console_ns | |||
| logger = logging.getLogger(__name__) | |||
| # define completion api for user | |||
| @console_ns.route( | |||
| "/installed-apps/<uuid:installed_app_id>/completion-messages", | |||
| endpoint="installed_app_completion", | |||
| ) | |||
| class CompletionApi(InstalledAppResource): | |||
| def post(self, installed_app): | |||
| app_model = installed_app.app | |||
| @@ -87,6 +93,10 @@ class CompletionApi(InstalledAppResource): | |||
| raise InternalServerError() | |||
| @console_ns.route( | |||
| "/installed-apps/<uuid:installed_app_id>/completion-messages/<string:task_id>/stop", | |||
| endpoint="installed_app_stop_completion", | |||
| ) | |||
| class CompletionStopApi(InstalledAppResource): | |||
| def post(self, installed_app, task_id): | |||
| app_model = installed_app.app | |||
| @@ -100,6 +110,10 @@ class CompletionStopApi(InstalledAppResource): | |||
| return {"result": "success"}, 200 | |||
| @console_ns.route( | |||
| "/installed-apps/<uuid:installed_app_id>/chat-messages", | |||
| endpoint="installed_app_chat_completion", | |||
| ) | |||
| class ChatApi(InstalledAppResource): | |||
| def post(self, installed_app): | |||
| app_model = installed_app.app | |||
| @@ -153,6 +167,10 @@ class ChatApi(InstalledAppResource): | |||
| raise InternalServerError() | |||
| @console_ns.route( | |||
| "/installed-apps/<uuid:installed_app_id>/chat-messages/<string:task_id>/stop", | |||
| endpoint="installed_app_stop_chat_completion", | |||
| ) | |||
| class ChatStopApi(InstalledAppResource): | |||
| def post(self, installed_app, task_id): | |||
| app_model = installed_app.app | |||
| @@ -16,7 +16,13 @@ from services.conversation_service import ConversationService | |||
| from services.errors.conversation import ConversationNotExistsError, LastConversationNotExistsError | |||
| from services.web_conversation_service import WebConversationService | |||
| from .. import console_ns | |||
| @console_ns.route( | |||
| "/installed-apps/<uuid:installed_app_id>/conversations", | |||
| endpoint="installed_app_conversations", | |||
| ) | |||
| class ConversationListApi(InstalledAppResource): | |||
| @marshal_with(conversation_infinite_scroll_pagination_fields) | |||
| def get(self, installed_app): | |||
| @@ -52,6 +58,10 @@ class ConversationListApi(InstalledAppResource): | |||
| raise NotFound("Last Conversation Not Exists.") | |||
| @console_ns.route( | |||
| "/installed-apps/<uuid:installed_app_id>/conversations/<uuid:c_id>", | |||
| endpoint="installed_app_conversation", | |||
| ) | |||
| class ConversationApi(InstalledAppResource): | |||
| def delete(self, installed_app, c_id): | |||
| app_model = installed_app.app | |||
| @@ -70,6 +80,10 @@ class ConversationApi(InstalledAppResource): | |||
| return {"result": "success"}, 204 | |||
| @console_ns.route( | |||
| "/installed-apps/<uuid:installed_app_id>/conversations/<uuid:c_id>/name", | |||
| endpoint="installed_app_conversation_rename", | |||
| ) | |||
| class ConversationRenameApi(InstalledAppResource): | |||
| @marshal_with(simple_conversation_fields) | |||
| def post(self, installed_app, c_id): | |||
| @@ -95,6 +109,10 @@ class ConversationRenameApi(InstalledAppResource): | |||
| raise NotFound("Conversation Not Exists.") | |||
| @console_ns.route( | |||
| "/installed-apps/<uuid:installed_app_id>/conversations/<uuid:c_id>/pin", | |||
| endpoint="installed_app_conversation_pin", | |||
| ) | |||
| class ConversationPinApi(InstalledAppResource): | |||
| def patch(self, installed_app, c_id): | |||
| app_model = installed_app.app | |||
| @@ -114,6 +132,10 @@ class ConversationPinApi(InstalledAppResource): | |||
| return {"result": "success"} | |||
| @console_ns.route( | |||
| "/installed-apps/<uuid:installed_app_id>/conversations/<uuid:c_id>/unpin", | |||
| endpoint="installed_app_conversation_unpin", | |||
| ) | |||
| class ConversationUnPinApi(InstalledAppResource): | |||
| def patch(self, installed_app, c_id): | |||
| app_model = installed_app.app | |||
| @@ -36,9 +36,15 @@ from services.errors.message import ( | |||
| ) | |||
| from services.message_service import MessageService | |||
| from .. import console_ns | |||
| logger = logging.getLogger(__name__) | |||
| @console_ns.route( | |||
| "/installed-apps/<uuid:installed_app_id>/messages", | |||
| endpoint="installed_app_messages", | |||
| ) | |||
| class MessageListApi(InstalledAppResource): | |||
| @marshal_with(message_infinite_scroll_pagination_fields) | |||
| def get(self, installed_app): | |||
| @@ -66,6 +72,10 @@ class MessageListApi(InstalledAppResource): | |||
| raise NotFound("First Message Not Exists.") | |||
| @console_ns.route( | |||
| "/installed-apps/<uuid:installed_app_id>/messages/<uuid:message_id>/feedbacks", | |||
| endpoint="installed_app_message_feedback", | |||
| ) | |||
| class MessageFeedbackApi(InstalledAppResource): | |||
| def post(self, installed_app, message_id): | |||
| app_model = installed_app.app | |||
| @@ -93,6 +103,10 @@ class MessageFeedbackApi(InstalledAppResource): | |||
| return {"result": "success"} | |||
| @console_ns.route( | |||
| "/installed-apps/<uuid:installed_app_id>/messages/<uuid:message_id>/more-like-this", | |||
| endpoint="installed_app_more_like_this", | |||
| ) | |||
| class MessageMoreLikeThisApi(InstalledAppResource): | |||
| def get(self, installed_app, message_id): | |||
| app_model = installed_app.app | |||
| @@ -139,6 +153,10 @@ class MessageMoreLikeThisApi(InstalledAppResource): | |||
| raise InternalServerError() | |||
| @console_ns.route( | |||
| "/installed-apps/<uuid:installed_app_id>/messages/<uuid:message_id>/suggested-questions", | |||
| endpoint="installed_app_suggested_question", | |||
| ) | |||
| class MessageSuggestedQuestionApi(InstalledAppResource): | |||
| def get(self, installed_app, message_id): | |||
| app_model = installed_app.app | |||
| @@ -27,9 +27,12 @@ from models.model import AppMode, InstalledApp | |||
| from services.app_generate_service import AppGenerateService | |||
| from services.errors.llm import InvokeRateLimitError | |||
| from .. import console_ns | |||
| logger = logging.getLogger(__name__) | |||
| @console_ns.route("/installed-apps/<uuid:installed_app_id>/workflows/run") | |||
| class InstalledAppWorkflowRunApi(InstalledAppResource): | |||
| def post(self, installed_app: InstalledApp): | |||
| """ | |||
| @@ -70,6 +73,7 @@ class InstalledAppWorkflowRunApi(InstalledAppResource): | |||
| raise InternalServerError() | |||
| @console_ns.route("/installed-apps/<uuid:installed_app_id>/workflows/tasks/<string:task_id>/stop") | |||
| class InstalledAppWorkflowTaskStopApi(InstalledAppResource): | |||
| def post(self, installed_app: InstalledApp, task_id: str): | |||
| """ | |||
| @@ -26,9 +26,12 @@ from libs.login import login_required | |||
| from models import Account | |||
| from services.file_service import FileService | |||
| from . import console_ns | |||
| PREVIEW_WORDS_LIMIT = 3000 | |||
| @console_ns.route("/files/upload") | |||
| class FileApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -88,6 +91,7 @@ class FileApi(Resource): | |||
| return upload_file, 201 | |||
| @console_ns.route("/files/<uuid:file_id>/preview") | |||
| class FilePreviewApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -98,6 +102,7 @@ class FilePreviewApi(Resource): | |||
| return {"content": text} | |||
| @console_ns.route("/files/support-type") | |||
| class FileSupportTypeApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -19,7 +19,10 @@ from fields.file_fields import file_fields_with_signed_url, remote_file_info_fie | |||
| from models.account import Account | |||
| from services.file_service import FileService | |||
| from . import console_ns | |||
| @console_ns.route("/remote-files/<path:url>") | |||
| class RemoteFileInfoApi(Resource): | |||
| @marshal_with(remote_file_info_fields) | |||
| def get(self, url): | |||
| @@ -35,6 +38,7 @@ class RemoteFileInfoApi(Resource): | |||
| } | |||
| @console_ns.route("/remote-files/upload") | |||
| class RemoteFileUploadApi(Resource): | |||
| @marshal_with(file_fields_with_signed_url) | |||
| def post(self): | |||
| @@ -2,7 +2,6 @@ import logging | |||
| from flask_restx import Resource | |||
| from controllers.console import api | |||
| from controllers.console.wraps import ( | |||
| account_initialization_required, | |||
| setup_required, | |||
| @@ -10,9 +9,12 @@ from controllers.console.wraps import ( | |||
| from core.schemas.schema_manager import SchemaManager | |||
| from libs.login import login_required | |||
| from . import console_ns | |||
| logger = logging.getLogger(__name__) | |||
| @console_ns.route("/spec/schema-definitions") | |||
| class SpecSchemaDefinitionsApi(Resource): | |||
| @setup_required | |||
| @login_required | |||
| @@ -30,6 +32,3 @@ class SpecSchemaDefinitionsApi(Resource): | |||
| logger.exception("Failed to get schema definitions from local registry") | |||
| # Return empty array as fallback | |||
| return [], 200 | |||
| api.add_resource(SpecSchemaDefinitionsApi, "/spec/schema-definitions") | |||