From 847755b1c2bba658a2062e0f47dd97fa8ae37247 Mon Sep 17 00:00:00 2001 From: wxg0103 <727495428@qq.com> Date: Tue, 19 Aug 2025 15:15:46 +0800 Subject: [PATCH] feat: add response body schemas for various API endpoints --- .../swagger_api/application_api.py | 111 ++++++++++++++++++ apps/application/swagger_api/chat_api.py | 9 ++ apps/application/views/application_views.py | 8 +- apps/application/views/chat_views.py | 4 + apps/dataset/views/dataset.py | 1 + .../swagger_api/function_lib_api.py | 49 +++++++- apps/function_lib/views/function_lib_views.py | 4 + apps/function_lib/views/py_lint.py | 1 + apps/setting/serializers/team_serializers.py | 18 +++ apps/setting/views/Team.py | 4 + apps/setting/views/model.py | 12 +- apps/users/views/user.py | 4 +- 12 files changed, 216 insertions(+), 9 deletions(-) diff --git a/apps/application/swagger_api/application_api.py b/apps/application/swagger_api/application_api.py index 2c9cbd86b..a2f08f0ea 100644 --- a/apps/application/swagger_api/application_api.py +++ b/apps/application/swagger_api/application_api.py @@ -38,6 +38,15 @@ class ApplicationApi(ApiMixin): } ) + @staticmethod + def get_response_body_api(): + return openapi.Schema( + type=openapi.TYPE_STRING, + title=_("Application authentication token"), + description=_("Application authentication token"), + default="token" + ) + @staticmethod def get_response_body_api(): return openapi.Schema( @@ -133,6 +142,27 @@ class ApplicationApi(ApiMixin): } ) + @staticmethod + def get_response_body_api(): + return openapi.Schema( + type=openapi.TYPE_OBJECT, + properties={ + 'id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Primary key id"), + description=_("Primary key id")), + 'secret_key': openapi.Schema(type=openapi.TYPE_STRING, title=_("Secret key"), + description=_("Secret key")), + 'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Is activation"), + description=_("Is activation")), + 'application_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Application ID"), + description=_("Application ID")), + 'allow_cross_domain': openapi.Schema(type=openapi.TYPE_BOOLEAN, + title=_("Is cross-domain allowed"), + description=_("Is cross-domain allowed")), + 'cross_domain_list': openapi.Schema(type=openapi.TYPE_ARRAY, title=_('Cross-domain list'), + items=openapi.Schema(type=openapi.TYPE_STRING)) + } + ) + class AccessToken(ApiMixin): @staticmethod def get_request_params_api(): @@ -171,6 +201,37 @@ class ApplicationApi(ApiMixin): } ) + @staticmethod + def get_response_body_api(): + return openapi.Schema( + type=openapi.TYPE_OBJECT, + required=[], + properties={ + 'id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Primary key id"), + description=_("Primary key id")), + 'access_token': openapi.Schema(type=openapi.TYPE_STRING, title=_("Access Token"), + description=_("Access Token")), + 'access_token_reset': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Reset Token"), + description=_("Reset Token")), + + 'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Is activation"), + description=_("Is activation")), + 'access_num': openapi.Schema(type=openapi.TYPE_NUMBER, title=_("Number of visits"), + description=_("Number of visits")), + 'white_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Whether to enable whitelist"), + description=_("Whether to enable whitelist")), + 'white_list': openapi.Schema(type=openapi.TYPE_ARRAY, + items=openapi.Schema(type=openapi.TYPE_STRING), title=_("Whitelist"), + description=_("Whitelist")), + 'show_source': openapi.Schema(type=openapi.TYPE_BOOLEAN, + title=_("Whether to display knowledge sources"), + description=_("Whether to display knowledge sources")), + 'language': openapi.Schema(type=openapi.TYPE_STRING, + title=_("language"), + description=_("language")) + } + ) + class Edit(ApiMixin): @staticmethod def get_request_body_api(): @@ -367,6 +428,56 @@ class ApplicationApi(ApiMixin): } ) + @staticmethod + def get_response_body_api(): + return openapi.Schema( + type=openapi.TYPE_OBJECT, + required=['id', 'name', 'desc', 'model_id', 'dialogue_number', 'dataset_setting', 'model_setting', + 'problem_optimization', 'stt_model_enable', 'stt_model_enable', 'tts_type', + 'work_flow'], + properties={ + 'id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Primary key id"), + description=_("Primary key id")), + 'name': openapi.Schema(type=openapi.TYPE_STRING, title=_("Application Name"), + description=_("Application Name")), + 'desc': openapi.Schema(type=openapi.TYPE_STRING, title=_("Application Description"), + description=_("Application Description")), + 'model_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Model id"), + description=_("Model id")), + "dialogue_number": openapi.Schema(type=openapi.TYPE_NUMBER, + title=_("Number of multi-round conversations"), + description=_("Number of multi-round conversations")), + 'prologue': openapi.Schema(type=openapi.TYPE_STRING, title=_("Opening remarks"), + description=_("Opening remarks")), + 'dataset_id_list': openapi.Schema(type=openapi.TYPE_ARRAY, + items=openapi.Schema(type=openapi.TYPE_STRING), + title=_("List of associated knowledge base IDs"), + description=_("List of associated knowledge base IDs")), + 'dataset_setting': ApplicationApi.DatasetSetting.get_request_body_api(), + 'model_setting': ApplicationApi.ModelSetting.get_request_body_api(), + 'problem_optimization': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_("Problem Optimization"), + description=_("Problem Optimization"), default=True), + 'type': openapi.Schema(type=openapi.TYPE_STRING, title=_("Application Type"), + description=_("Application Type SIMPLE | WORK_FLOW")), + 'problem_optimization_prompt': openapi.Schema(type=openapi.TYPE_STRING, + title=_('Question optimization tips'), + description=_("Question optimization tips"), + default=_( + "() contains the user's question. Answer the guessed user's question based on the context ({question}) Requirement: Output a complete question and put it in the tag")), + 'tts_model_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Text-to-speech model ID"), + description=_("Text-to-speech model ID")), + 'stt_model_id': openapi.Schema(type=openapi.TYPE_STRING, title=_("Speech-to-text model id"), + description=_("Speech-to-text model id")), + 'stt_model_enable': openapi.Schema(type=openapi.TYPE_STRING, title=_("Is speech-to-text enabled"), + description=_("Is speech-to-text enabled")), + 'tts_model_enable': openapi.Schema(type=openapi.TYPE_STRING, title=_("Is text-to-speech enabled"), + description=_("Is text-to-speech enabled")), + 'tts_type': openapi.Schema(type=openapi.TYPE_STRING, title=_("Text-to-speech type"), + description=_("Text-to-speech type")), + 'work_flow': ApplicationApi.WorkFlow.get_request_body_api(), + } + ) + class Query(ApiMixin): @staticmethod def get_request_params_api(): diff --git a/apps/application/swagger_api/chat_api.py b/apps/application/swagger_api/chat_api.py index 54b5678f7..c5fa614c9 100644 --- a/apps/application/swagger_api/chat_api.py +++ b/apps/application/swagger_api/chat_api.py @@ -319,6 +319,15 @@ class ChatApi(ApiMixin): } ) + @staticmethod + def get_response_body_api(): + return openapi.Schema( + type=openapi.TYPE_STRING, + title=_("Conversation ID"), + description=_("Conversation ID"), + default="chat_id" + ) + @staticmethod def get_request_params_api(): return [openapi.Parameter(name='application_id', diff --git a/apps/application/views/application_views.py b/apps/application/views/application_views.py index f16041d1d..2628644f1 100644 --- a/apps/application/views/application_views.py +++ b/apps/application/views/application_views.py @@ -373,7 +373,8 @@ class Application(APIView): operation_id=_("Modify application API_KEY"), tags=[_('Application/API_KEY')], manual_parameters=ApplicationApi.ApiKey.Operate.get_request_params_api(), - request_body=ApplicationApi.ApiKey.Operate.get_request_body_api()) + request_body=ApplicationApi.ApiKey.Operate.get_request_body_api(), + responses=result.get_api_response(ApplicationApi.ApiKey.Operate.get_response_body_api())) @has_permissions(ViewPermission( [RoleConstants.ADMIN, RoleConstants.USER], [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE, @@ -415,7 +416,8 @@ class Application(APIView): operation_id=_("Modify Application AccessToken"), tags=[_('Application/Public Access')], manual_parameters=ApplicationApi.AccessToken.get_request_params_api(), - request_body=ApplicationApi.AccessToken.get_request_body_api()) + request_body=ApplicationApi.AccessToken.get_request_body_api(), + responses=result.get_api_response(ApplicationApi.AccessToken.get_response_body_api())) @has_permissions(ViewPermission( [RoleConstants.ADMIN, RoleConstants.USER], [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE, @@ -455,6 +457,7 @@ class Application(APIView): @swagger_auto_schema(operation_summary=_("Application Certification"), operation_id=_("Application Certification"), request_body=ApplicationApi.Authentication.get_request_body_api(), + responses=result.get_api_response(ApplicationApi.Authentication.get_response_body_api()), tags=[_("Application/Certification")], security=[]) def post(self, request: Request): @@ -472,6 +475,7 @@ class Application(APIView): @swagger_auto_schema(operation_summary=_("Create an application"), operation_id=_("Create an application"), request_body=ApplicationApi.Create.get_request_body_api(), + responses=result.get_api_response(ApplicationApi.Create.get_response_body_api()), tags=[_('Application')]) @has_permissions(PermissionConstants.APPLICATION_CREATE, compare=CompareConstants.AND) @log(menu='Application', operate="Create an application", diff --git a/apps/application/views/chat_views.py b/apps/application/views/chat_views.py index b0f42c020..e8d402b9a 100644 --- a/apps/application/views/chat_views.py +++ b/apps/application/views/chat_views.py @@ -94,6 +94,7 @@ class ChatView(APIView): @swagger_auto_schema(operation_summary=_("Get the workflow temporary session id"), operation_id=_("Get the workflow temporary session id"), request_body=ChatApi.OpenWorkFlowTemp.get_request_body_api(), + responses=result.get_api_response(ChatApi.OpenTempChat.get_response_body_api()), tags=[_("Application/Chat")]) def post(self, request: Request): return result.success(ChatSerializers.OpenWorkFlowChat( @@ -106,6 +107,7 @@ class ChatView(APIView): @swagger_auto_schema(operation_summary=_("Get a temporary session id"), operation_id=_("Get a temporary session id"), request_body=ChatApi.OpenTempChat.get_request_body_api(), + responses=result.get_api_response(ChatApi.OpenTempChat.get_response_body_api()), tags=[_("Application/Chat")]) @has_permissions(RoleConstants.ADMIN, RoleConstants.USER) def post(self, request: Request): @@ -239,6 +241,7 @@ class ChatView(APIView): @swagger_auto_schema(operation_summary=_("Client modifies dialogue summary"), operation_id=_("Client modifies dialogue summary"), request_body=ChatClientHistoryApi.Operate.ReAbstract.get_request_body_api(), + responses=result.get_default_response(), tags=[_("Application/Conversation Log")]) @has_permissions(ViewPermission( [RoleConstants.APPLICATION_ACCESS_TOKEN, RoleConstants.ADMIN, RoleConstants.USER], @@ -418,6 +421,7 @@ class ChatView(APIView): operation_id=_("Add to Knowledge Base"), manual_parameters=ImproveApi.get_request_params_api_post(), request_body=ImproveApi.get_request_body_api_post(), + responses=result.get_default_response(), tags=[_("Application/Conversation Log/Add to Knowledge Base")] ) @has_permissions( diff --git a/apps/dataset/views/dataset.py b/apps/dataset/views/dataset.py index bbb9e0339..40d9a0c65 100644 --- a/apps/dataset/views/dataset.py +++ b/apps/dataset/views/dataset.py @@ -181,6 +181,7 @@ class Dataset(APIView): @swagger_auto_schema(operation_summary=_('Generate related'), operation_id=_('Generate related'), manual_parameters=DataSetSerializers.Operate.get_request_params_api(), request_body=GenerateRelatedSerializer.get_request_body_api(), + responses=result.get_default_response(), tags=[_('Knowledge Base')] ) @log(menu='document', operate="Generate related documents", diff --git a/apps/function_lib/swagger_api/function_lib_api.py b/apps/function_lib/swagger_api/function_lib_api.py index 89b33b7ac..f0d409efa 100644 --- a/apps/function_lib/swagger_api/function_lib_api.py +++ b/apps/function_lib/swagger_api/function_lib_api.py @@ -195,6 +195,53 @@ class FunctionLibApi(ApiMixin): } ) + @staticmethod + def get_response_body_api(): + return openapi.Schema( + type=openapi.TYPE_OBJECT, + required=['id', 'name', 'code', 'input_field_list', 'permission_type'], + properties={ + 'id': openapi.Schema(type=openapi.TYPE_STRING, title="", description=_('ID')), + + 'name': openapi.Schema(type=openapi.TYPE_STRING, title=_('function name'), + description=_('function name')), + 'desc': openapi.Schema(type=openapi.TYPE_STRING, title=_('function description'), + description=_('function description')), + 'code': openapi.Schema(type=openapi.TYPE_STRING, title=_('function content'), + description=_('function content')), + 'permission_type': openapi.Schema(type=openapi.TYPE_STRING, title=_('permission'), + description=_('permission')), + 'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title=_('Is active'), + description=_('Is active')), + 'input_field_list': openapi.Schema(type=openapi.TYPE_ARRAY, + description=_('Input variable list'), + items=openapi.Schema(type=openapi.TYPE_OBJECT, + required=['name', 'is_required', 'source'], + properties={ + 'name': openapi.Schema( + type=openapi.TYPE_STRING, + title=_('variable name'), + description=_('variable name')), + 'is_required': openapi.Schema( + type=openapi.TYPE_BOOLEAN, + title=_('required'), + description=_('required')), + 'type': openapi.Schema( + type=openapi.TYPE_STRING, + title=_('type'), + description=_( + 'Field type string|int|dict|array|float') + ), + 'source': openapi.Schema( + type=openapi.TYPE_STRING, + title=_('source'), + description=_( + 'The source only supports custom|reference')), + + })) + } + ) + class Export(ApiMixin): @staticmethod def get_request_params_api(): @@ -214,4 +261,4 @@ class FunctionLibApi(ApiMixin): type=openapi.TYPE_FILE, required=True, description=_('Upload image files')) - ] \ No newline at end of file + ] diff --git a/apps/function_lib/views/function_lib_views.py b/apps/function_lib/views/function_lib_views.py index 018c015d0..e865566e3 100644 --- a/apps/function_lib/views/function_lib_views.py +++ b/apps/function_lib/views/function_lib_views.py @@ -44,6 +44,7 @@ class FunctionLibView(APIView): @swagger_auto_schema(operation_summary=_('Create function'), operation_id=_('Create function'), request_body=FunctionLibApi.Create.get_request_body_api(), + responses=result.get_api_response(FunctionLibApi.Create.get_response_body_api()), tags=[_('Function')]) @has_permissions(RoleConstants.ADMIN, RoleConstants.USER) @log(menu='Function', operate="Create function", @@ -58,6 +59,7 @@ class FunctionLibView(APIView): @swagger_auto_schema(operation_summary=_('Debug function'), operation_id=_('Debug function'), request_body=FunctionLibApi.Debug.get_request_body_api(), + responses=result.get_default_response(), tags=[_('Function')]) @has_permissions(RoleConstants.ADMIN, RoleConstants.USER) def post(self, request: Request): @@ -72,6 +74,7 @@ class FunctionLibView(APIView): @swagger_auto_schema(operation_summary=_('Update function'), operation_id=_('Update function'), request_body=FunctionLibApi.Edit.get_request_body_api(), + responses=result.get_api_response(FunctionLibApi.Edit.get_request_body_api()), tags=[_('Function')]) @has_permissions(RoleConstants.ADMIN, RoleConstants.USER) @log(menu='Function', operate="Update function", @@ -84,6 +87,7 @@ class FunctionLibView(APIView): @action(methods=['DELETE'], detail=False) @swagger_auto_schema(operation_summary=_('Delete function'), operation_id=_('Delete function'), + responses=result.get_default_response(), tags=[_('Function')]) @has_permissions(RoleConstants.ADMIN, RoleConstants.USER) @log(menu='Function', operate="Delete function", diff --git a/apps/function_lib/views/py_lint.py b/apps/function_lib/views/py_lint.py index acfe8fcc6..a0bee2a4c 100644 --- a/apps/function_lib/views/py_lint.py +++ b/apps/function_lib/views/py_lint.py @@ -26,6 +26,7 @@ class PyLintView(APIView): @swagger_auto_schema(operation_summary=_('Check code'), operation_id=_('Check code'), request_body=PyLintApi.get_request_body_api(), + responses=result.get_api_response(PyLintApi.get_request_body_api()), tags=[_('Function')]) @has_permissions(RoleConstants.ADMIN, RoleConstants.USER) def post(self, request: Request): diff --git a/apps/setting/serializers/team_serializers.py b/apps/setting/serializers/team_serializers.py index 5ee041022..0b264e88b 100644 --- a/apps/setting/serializers/team_serializers.py +++ b/apps/setting/serializers/team_serializers.py @@ -171,6 +171,24 @@ class TeamMemberSerializer(ApiMixin, serializers.Serializer): } ) + @staticmethod + def get_response_body_api(): + return openapi.Schema( + type=openapi.TYPE_OBJECT, + properties={ + 'id': openapi.Schema(type=openapi.TYPE_STRING, title=_('user id'), description=_('user id')), + 'username': openapi.Schema(type=openapi.TYPE_STRING, title=_('Username'), description=_('Username')), + 'email': openapi.Schema(type=openapi.TYPE_STRING, title=_('Email'), description=_('Email')), + 'role': openapi.Schema(type=openapi.TYPE_STRING, title=_('Role'), description=_('Role')), + 'is_active': openapi.Schema(type=openapi.TYPE_STRING, title=_('Is active'), + description=_('Is active')), + 'team_id': openapi.Schema(type=openapi.TYPE_STRING, title=_('team id'), description=_('team id')), + 'user_id': openapi.Schema(type=openapi.TYPE_STRING, title=_('user id'), description=_('user id')), + 'type': openapi.Schema(type=openapi.TYPE_STRING, title=_('member type'), + description=_('member type manage|member')), + } + ) + @transaction.atomic def batch_add_member(self, user_id_list: List[str], with_valid=True): """ diff --git a/apps/setting/views/Team.py b/apps/setting/views/Team.py index 4dff7e733..9c2ade72f 100644 --- a/apps/setting/views/Team.py +++ b/apps/setting/views/Team.py @@ -38,6 +38,7 @@ class TeamMember(APIView): @swagger_auto_schema(operation_summary=_('Add member'), operation_id=_('Add member'), request_body=TeamMemberSerializer().get_request_body_api(), + responses=result.get_default_response(), tags=[_('Team')]) @has_permissions(PermissionConstants.TEAM_CREATE) @log(menu='Team', operate='Add member', @@ -53,6 +54,7 @@ class TeamMember(APIView): @swagger_auto_schema(operation_summary=_('Add members in batches'), operation_id=_('Add members in batches'), request_body=TeamMemberSerializer.get_bach_request_body_api(), + responses=result.get_api_array_response(TeamMemberSerializer.get_response_body_api()), tags=[_('Team')]) @has_permissions(PermissionConstants.TEAM_CREATE) @log(menu='Team', operate='Add members in batches', @@ -78,6 +80,7 @@ class TeamMember(APIView): @swagger_auto_schema(operation_summary=_('Update team member permissions'), operation_id=_('Update team member permissions'), request_body=UpdateTeamMemberPermissionSerializer().get_request_body_api(), + responses=result.get_default_response(), manual_parameters=TeamMemberSerializer.Operate.get_request_params_api(), tags=[_('Team')] ) @@ -93,6 +96,7 @@ class TeamMember(APIView): @swagger_auto_schema(operation_summary=_('Remove member'), operation_id=_('Remove member'), manual_parameters=TeamMemberSerializer.Operate.get_request_params_api(), + responses=result.get_default_response(), tags=[_('Team')] ) @has_permissions(PermissionConstants.TEAM_DELETE) diff --git a/apps/setting/views/model.py b/apps/setting/views/model.py index 7b926013b..4fe13d1d9 100644 --- a/apps/setting/views/model.py +++ b/apps/setting/views/model.py @@ -31,7 +31,8 @@ class Model(APIView): @action(methods=['POST'], detail=False) @swagger_auto_schema(operation_summary=_('Create model'), operation_id=_('Create model'), - request_body=ModelCreateApi.get_request_body_api() + request_body=ModelCreateApi.get_request_body_api(), + manual_parameters=result.get_api_response(ModelCreateApi.get_request_body_api()) , tags=[_('model')]) @has_permissions(PermissionConstants.MODEL_CREATE) @log(menu='model', operate='Create model', @@ -45,7 +46,8 @@ class Model(APIView): @action(methods=['PUT'], detail=False) @swagger_auto_schema(operation_summary=_('Download model, trial only with Ollama platform'), operation_id=_('Download model, trial only with Ollama platform'), - request_body=ModelCreateApi.get_request_body_api() + request_body=ModelCreateApi.get_request_body_api(), + responses=result.get_api_response(ModelCreateApi.get_request_body_api()) , tags=[_('model')]) @has_permissions(PermissionConstants.MODEL_CREATE) def put(self, request: Request): @@ -123,7 +125,8 @@ class Model(APIView): @action(methods=['PUT'], detail=False) @swagger_auto_schema(operation_summary=_('Update model'), operation_id=_('Update model'), - request_body=ModelEditApi.get_request_body_api() + request_body=ModelEditApi.get_request_body_api(), + responses=result.get_api_response(ModelEditApi.get_request_body_api()) , tags=[_('model')]) @has_permissions(PermissionConstants.MODEL_CREATE) @log(menu='model', operate='Update model', @@ -166,7 +169,8 @@ class Provide(APIView): @swagger_auto_schema(operation_summary=_('Call the supplier function to obtain form data'), operation_id=_('Call the supplier function to obtain form data'), manual_parameters=ProvideApi.get_request_params_api(), - request_body=ProvideApi.get_request_body_api() + request_body=ProvideApi.get_request_body_api(), + responses=result.get_api_response(ProvideApi.get_request_body_api()) , tags=[_('model')]) @has_permissions(PermissionConstants.MODEL_READ) @log(menu='model', operate='Call the supplier function to obtain form data') diff --git a/apps/users/views/user.py b/apps/users/views/user.py index 9e21daa4e..d4b9f8a6a 100644 --- a/apps/users/views/user.py +++ b/apps/users/views/user.py @@ -84,7 +84,7 @@ class SwitchUserLanguageView(APIView): description=_("language")), } ), - responses=RePasswordSerializer().get_response_body_api(), + responses=result.get_default_response(), tags=[_("User management")]) @log(menu='User management', operate='Switch Language', get_operation_object=lambda r, k: {'name': r.user.username}) @@ -111,7 +111,7 @@ class ResetCurrentUserPasswordView(APIView): description=_("Password")) } ), - responses=RePasswordSerializer().get_response_body_api(), + responses=result.get_default_response(), tags=[_("User management")]) @log(menu='User management', operate='Modify current user password', get_operation_object=lambda r, k: {'name': r.user.username},