From c0ffc0aaf518f68d634944320cc9cc15373af0d5 Mon Sep 17 00:00:00 2001 From: liqiang-fit2cloud Date: Wed, 9 Apr 2025 09:57:11 +0800 Subject: [PATCH 001/139] security: fix reverse shell vulnerability in function library. --- apps/common/util/function_code.py | 2 +- installer/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/common/util/function_code.py b/apps/common/util/function_code.py index 31797a9f425..30ce3a33d20 100644 --- a/apps/common/util/function_code.py +++ b/apps/common/util/function_code.py @@ -88,7 +88,7 @@ def _exec_sandbox(self, _code, _id): os.system(f"chown {self.user}:{self.user} {exec_python_file}") kwargs = {'cwd': BASE_DIR} subprocess_result = subprocess.run( - ['su', '-c', python_directory + ' ' + exec_python_file, self.user], + ['su', '-s', python_directory, '-c', "exec(open('" + exec_python_file + "').read())", self.user], text=True, capture_output=True, **kwargs) os.remove(exec_python_file) diff --git a/installer/Dockerfile b/installer/Dockerfile index a2dc3f66264..d2c1eefb6fa 100644 --- a/installer/Dockerfile +++ b/installer/Dockerfile @@ -70,7 +70,7 @@ RUN chmod 755 /opt/maxkb/app/installer/run-maxkb.sh && \ useradd --no-create-home --home /opt/maxkb/app/sandbox sandbox -g root && \ chown -R sandbox:root /opt/maxkb/app/sandbox && \ chmod g-x /usr/local/bin/* /usr/bin/* /bin/* /usr/sbin/* /sbin/* /usr/lib/postgresql/15/bin/* && \ - chmod g+x /usr/local/bin/python* /bin/sh + chmod g+x /usr/local/bin/python* EXPOSE 8080 From 0b60a03e5df917b91b153227f8cf8d6f7510f292 Mon Sep 17 00:00:00 2001 From: ivy <188476399@qq.com> Date: Fri, 11 Apr 2025 16:56:41 +0800 Subject: [PATCH 002/139] perf: refine copywriting --- ui/src/locales/lang/en-US/views/system.ts | 1 + ui/src/locales/lang/zh-CN/views/system.ts | 3 ++- ui/src/locales/lang/zh-Hant/views/system.ts | 3 ++- ui/src/router/modules/setting.ts | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ui/src/locales/lang/en-US/views/system.ts b/ui/src/locales/lang/en-US/views/system.ts index 303d1175dcf..6488ed6b5ae 100644 --- a/ui/src/locales/lang/en-US/views/system.ts +++ b/ui/src/locales/lang/en-US/views/system.ts @@ -1,5 +1,6 @@ export default { title: 'System', + subTitle: 'Setting', test: 'Test Connection', testSuccess: 'Successful', testFailed: 'Test connection failed', diff --git a/ui/src/locales/lang/zh-CN/views/system.ts b/ui/src/locales/lang/zh-CN/views/system.ts index 9ce23d90d86..1b72e1e01e1 100644 --- a/ui/src/locales/lang/zh-CN/views/system.ts +++ b/ui/src/locales/lang/zh-CN/views/system.ts @@ -1,5 +1,6 @@ export default { - title: '系统设置', + title: '系统管理', + subTitle: '系统设置', test: '测试连接', testSuccess: '测试连接成功', testFailed: '测试连接失败', diff --git a/ui/src/locales/lang/zh-Hant/views/system.ts b/ui/src/locales/lang/zh-Hant/views/system.ts index 10259390be1..e27e6c1228c 100644 --- a/ui/src/locales/lang/zh-Hant/views/system.ts +++ b/ui/src/locales/lang/zh-Hant/views/system.ts @@ -1,5 +1,6 @@ export default { - title: '系統設置', + title: '系統管理', + subTitle: '系統設置', test: '測試連線', testSuccess: '測試連線成功', testFailed: '測試連線失敗', diff --git a/ui/src/router/modules/setting.ts b/ui/src/router/modules/setting.ts index e97a658b02b..eaedb6a5f50 100644 --- a/ui/src/router/modules/setting.ts +++ b/ui/src/router/modules/setting.ts @@ -59,7 +59,7 @@ const settingRouter = { meta: { icon: 'app-setting', iconActive: 'app-setting-active', - title: 'common.setting', + title: 'views.system.subTitle', activeMenu: '/setting', parentPath: '/setting', parentName: 'setting', From 3b24373cd076e17842fbf374b06531f49cac4795 Mon Sep 17 00:00:00 2001 From: CaptainB Date: Mon, 14 Apr 2025 14:19:31 +0800 Subject: [PATCH 003/139] fix: handle line breaks in cell content for markdown table formatting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --bug=1054683 --user=刘瑞斌 【github#2831】知识库上传excel、应用编排文档内容提取节点中上传excel,单元格中有换行,导入后没有在一个单元格里显示 https://www.tapd.cn/57709429/s/1685274 --- apps/common/handle/impl/table/xls_parse_table_handle.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/common/handle/impl/table/xls_parse_table_handle.py b/apps/common/handle/impl/table/xls_parse_table_handle.py index 5609e3e8835..897e347e8a8 100644 --- a/apps/common/handle/impl/table/xls_parse_table_handle.py +++ b/apps/common/handle/impl/table/xls_parse_table_handle.py @@ -82,7 +82,10 @@ def get_content(self, file, save_image): for row in data: # 将每个单元格中的内容替换换行符为
以保留原始格式 md_table += '| ' + ' | '.join( - [str(cell).replace('\n', '
') if cell else '' for cell in row]) + ' |\n' + [str(cell) + .replace('\r\n', '
') + .replace('\n', '
') + if cell else '' for cell in row]) + ' |\n' md_tables += md_table + '\n\n' return md_tables From c781c11d268395f591f2046822a49987002cb3cf Mon Sep 17 00:00:00 2001 From: wangdan-fit2cloud <79562285+wangdan-fit2cloud@users.noreply.github.com> Date: Mon, 14 Apr 2025 15:11:55 +0800 Subject: [PATCH 004/139] fix: Application chat page style issue (#2866) --- ui/src/views/chat/base/index.vue | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/ui/src/views/chat/base/index.vue b/ui/src/views/chat/base/index.vue index 27be286f25a..7156f7d894a 100644 --- a/ui/src/views/chat/base/index.vue +++ b/ui/src/views/chat/base/index.vue @@ -42,7 +42,6 @@ - diff --git a/ui/src/views/login/reset-password/index.vue b/ui/src/views/login/reset-password/index.vue index 2c2ff02576e..576e6f340a6 100644 --- a/ui/src/views/login/reset-password/index.vue +++ b/ui/src/views/login/reset-password/index.vue @@ -1,6 +1,10 @@ - + From b62c79fda69f42fd528cba96a33878cc4155d86e Mon Sep 17 00:00:00 2001 From: wangdan-fit2cloud Date: Thu, 10 Jul 2025 11:36:16 +0800 Subject: [PATCH 133/139] fix: text bug --- .../lang/zh-CN/views/application-workflow.ts | 2 +- .../views/application/ApplicationAccess.vue | 49 +------------------ 2 files changed, 2 insertions(+), 49 deletions(-) diff --git a/ui/src/locales/lang/zh-CN/views/application-workflow.ts b/ui/src/locales/lang/zh-CN/views/application-workflow.ts index 1495316b836..c7c6038cc5f 100644 --- a/ui/src/locales/lang/zh-CN/views/application-workflow.ts +++ b/ui/src/locales/lang/zh-CN/views/application-workflow.ts @@ -266,7 +266,7 @@ export default { label: '文本转语音', text: '将文本通过语音合成模型转换为音频', tts_model: { - label: '语音识别模型' + label: '语音合成模型' }, content: { label: '选择文本内容' diff --git a/ui/src/views/application/ApplicationAccess.vue b/ui/src/views/application/ApplicationAccess.vue index ce2fe6aab82..8e1bf03b7e6 100644 --- a/ui/src/views/application/ApplicationAccess.vue +++ b/ui/src/views/application/ApplicationAccess.vue @@ -135,51 +135,4 @@ onMounted(() => { }) - + From e1ada3ffe24e5f11962f16dad7c3495d12518bdf Mon Sep 17 00:00:00 2001 From: liqiang-fit2cloud Date: Thu, 10 Jul 2025 17:37:21 +0800 Subject: [PATCH 134/139] Update build-and-push.yml --- .github/workflows/build-and-push.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-push.yml b/.github/workflows/build-and-push.yml index 2c873cd36ee..1e1daf2696c 100644 --- a/.github/workflows/build-and-push.yml +++ b/.github/workflows/build-and-push.yml @@ -64,7 +64,7 @@ jobs: TAG_NAME=${{ github.event.inputs.dockerImageTag }} TAG_NAME_WITH_LATEST=${{ github.event.inputs.dockerImageTagWithLatest }} if [[ ${TAG_NAME_WITH_LATEST} == 'true' ]]; then - DOCKER_IMAGE_TAGS="--tag ${DOCKER_IMAGE}:${TAG_NAME} --tag ${DOCKER_IMAGE}:latest" + DOCKER_IMAGE_TAGS="--tag ${DOCKER_IMAGE}:${TAG_NAME} --tag ${DOCKER_IMAGE}:${TAG_NAME%%.*}" else DOCKER_IMAGE_TAGS="--tag ${DOCKER_IMAGE}:${TAG_NAME}" fi @@ -122,7 +122,7 @@ jobs: TAG_NAME=${{ github.event.inputs.dockerImageTag }} TAG_NAME_WITH_LATEST=${{ github.event.inputs.dockerImageTagWithLatest }} if [[ ${TAG_NAME_WITH_LATEST} == 'true' ]]; then - DOCKER_IMAGE_TAGS="--tag ${DOCKER_IMAGE}:${TAG_NAME} --tag ${DOCKER_IMAGE}:latest" + DOCKER_IMAGE_TAGS="--tag ${DOCKER_IMAGE}:${TAG_NAME} --tag ${DOCKER_IMAGE}:${TAG_NAME%%.*}" else DOCKER_IMAGE_TAGS="--tag ${DOCKER_IMAGE}:${TAG_NAME}" fi From 90c64d77dde7058a084e65f45c9112bda139943f Mon Sep 17 00:00:00 2001 From: maninhill <41712985+maninhill@users.noreply.github.com> Date: Mon, 14 Jul 2025 17:27:02 +0800 Subject: [PATCH 135/139] chore: Update README.md (#3584) --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 06025c069c3..b4ef070847f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

MaxKB

-

An Open-Source AI Assistant for Enterprise

+

Open-source platform for building enterprise-grade agents

1Panel-dev%2FMaxKB | Trendshift

License: GPL v3 @@ -10,7 +10,7 @@


-MaxKB = Max Knowledge Brain, it is a powerful and easy-to-use AI assistant that integrates Retrieval-Augmented Generation (RAG) pipelines, supports robust workflows, and provides advanced MCP tool-use capabilities. MaxKB is widely applied in scenarios such as intelligent customer service, corporate internal knowledge bases, academic research, and education. +MaxKB = Max Knowledge Brain, it is an open-source platform for building enterprise-grade agents. MaxKB integrates Retrieval-Augmented Generation (RAG) pipelines, supports robust workflows, and provides advanced MCP tool-use capabilities. MaxKB is widely applied in scenarios such as intelligent customer service, corporate internal knowledge bases, academic research, and education. - **RAG Pipeline**: Supports direct uploading of documents / automatic crawling of online documents, with features for automatic text splitting, vectorization. This effectively reduces hallucinations in large models, providing a superior smart Q&A interaction experience. - **Agentic Workflow**: Equipped with a powerful workflow engine, function library and MCP tool-use, enabling the orchestration of AI processes to meet the needs of complex business scenarios. @@ -55,8 +55,6 @@ Access MaxKB web interface at `http://your_server_ip:8080` with default admin cr ## Feature Comparison -MaxKB is positioned as an Ready-to-use RAG (Retrieval-Augmented Generation) intelligent Q&A application, rather than a middleware platform for building large model applications. The following table is merely a comparison from a functional perspective. - From d47699331c4f67bbf055394f76ba1ff4caad38da Mon Sep 17 00:00:00 2001 From: maninhill <41712985+maninhill@users.noreply.github.com> Date: Mon, 14 Jul 2025 17:28:34 +0800 Subject: [PATCH 136/139] chore: Update README_CN.md (#3585) --- README_CN.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README_CN.md b/README_CN.md index 11c0df23b14..aec9379eea8 100644 --- a/README_CN.md +++ b/README_CN.md @@ -1,5 +1,5 @@

MaxKB

-

强大易用的企业级 AI 助手

+

强大易用的企业级智能体平台

1Panel-dev%2FMaxKB | Trendshift

@@ -14,7 +14,7 @@


-MaxKB = Max Knowledge Brain,是一款强大易用的企业级 AI 助手,支持 RAG 检索增强生成、工作流编排、MCP 工具调用能力。MaxKB 支持对接各种主流大语言模型,广泛应用于智能客服、企业内部知识库问答、员工助手、学术研究与教育等场景。 +MaxKB = Max Knowledge Brain,是一款强大易用的企业级智能体平台,支持 RAG 检索增强生成、工作流编排、MCP 工具调用能力。MaxKB 支持对接各种主流大语言模型,广泛应用于智能客服、企业内部知识库问答、员工助手、学术研究与教育等场景。 - **RAG 检索增强生成**:高效搭建本地 AI 知识库,支持直接上传文档 / 自动爬取在线文档,支持文本自动拆分、向量化,有效减少大模型幻觉,提升问答效果; - **灵活编排**:内置强大的工作流引擎、函数库和 MCP 工具调用能力,支持编排 AI 工作过程,满足复杂业务场景下的需求; From 2a257edff93c4a3602f084578675d7460c8a282c Mon Sep 17 00:00:00 2001 From: maninhill <41712985+maninhill@users.noreply.github.com> Date: Mon, 14 Jul 2025 17:49:32 +0800 Subject: [PATCH 137/139] chore: Update README.md (#3587) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b4ef070847f..7acd92c539c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@

MaxKB

Open-source platform for building enterprise-grade agents

+

强大易用的企业级智能体平台

1Panel-dev%2FMaxKB | Trendshift

License: GPL v3 From b57455d0eec8caa80f3a096555597dad26920e5c Mon Sep 17 00:00:00 2001 From: wxg0103 <727495428@qq.com> Date: Tue, 19 Aug 2025 11:06:36 +0800 Subject: [PATCH 138/139] refactor: expand permissions for application access token MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --bug=1060032 --user=王孝刚 【桂物智慧】 api 调用客户端修改对话摘要接口,报错403,没有访问权限 https://www.tapd.cn/57709429/s/1757188 --- apps/application/views/chat_views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/application/views/chat_views.py b/apps/application/views/chat_views.py index 77a087351ee..b0f42c020b9 100644 --- a/apps/application/views/chat_views.py +++ b/apps/application/views/chat_views.py @@ -241,7 +241,7 @@ def delete(self, request: Request, application_id: str, chat_id: str): request_body=ChatClientHistoryApi.Operate.ReAbstract.get_request_body_api(), tags=[_("Application/Conversation Log")]) @has_permissions(ViewPermission( - [RoleConstants.APPLICATION_ACCESS_TOKEN], + [RoleConstants.APPLICATION_ACCESS_TOKEN, RoleConstants.ADMIN, RoleConstants.USER], [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND), 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 139/139] 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 2c9cbd86bf4..a2f08f0eae8 100644 --- a/apps/application/swagger_api/application_api.py +++ b/apps/application/swagger_api/application_api.py @@ -38,6 +38,15 @@ def get_request_body_api(): } ) + @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 @@ def get_request_body_api(): } ) + @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 @@ def get_request_body_api(): } ) + @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 @@ def get_request_body_api(): } ) + @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 54b5678f747..c5fa614c964 100644 --- a/apps/application/swagger_api/chat_api.py +++ b/apps/application/swagger_api/chat_api.py @@ -319,6 +319,15 @@ def get_request_body_api(): } ) + @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 f16041d1de3..2628644f1d1 100644 --- a/apps/application/views/application_views.py +++ b/apps/application/views/application_views.py @@ -373,7 +373,8 @@ class Operate(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 AccessToken(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 @@ def options(self, request, *args, **kwargs): @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 @@ def post(self, request: Request): @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 b0f42c020b9..e8d402b9ae9 100644 --- a/apps/application/views/chat_views.py +++ b/apps/application/views/chat_views.py @@ -94,6 +94,7 @@ class OpenWorkFlowTemp(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 OpenTemp(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 @@ def delete(self, request: Request, application_id: str, chat_id: str): @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 @@ def put(self, request: Request, application_id: str, chat_id: str, chat_record_i 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 bbb9e033980..40d9a0c6514 100644 --- a/apps/dataset/views/dataset.py +++ b/apps/dataset/views/dataset.py @@ -181,6 +181,7 @@ class GenerateRelated(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 89b33b7acf3..f0d409efaf8 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 @@ def get_request_body_api(): } ) + @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 @@ def get_request_params_api(): 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 018c015d030..e865566e3be 100644 --- a/apps/function_lib/views/function_lib_views.py +++ b/apps/function_lib/views/function_lib_views.py @@ -44,6 +44,7 @@ def get(self, request: Request): @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 Debug(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 Operate(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 @@ def put(self, request: Request, function_lib_id: str): @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 acfe8fcc6b2..a0bee2a4c02 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 5ee041022be..0b264e88b29 100644 --- a/apps/setting/serializers/team_serializers.py +++ b/apps/setting/serializers/team_serializers.py @@ -171,6 +171,24 @@ def get_request_body_api(): } ) + @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 4dff7e7332d..9c2ade72fbc 100644 --- a/apps/setting/views/Team.py +++ b/apps/setting/views/Team.py @@ -38,6 +38,7 @@ def get(self, request: Request): @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 Batch(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 @@ def get(self, request: Request, member_id: str): @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 @@ def put(self, request: Request, member_id: str): @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 7b926013b7e..4fe13d1d95f 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 @@ def post(self, request: Request): @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 Operate(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 Exec(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 9e21daa4ee9..d4b9f8a6a41 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},

Feature