From ed7d3d8b1e28ed93f5bad7852c61c5d6a9911c3c Mon Sep 17 00:00:00 2001 From: shaohuzhang1 <80892890+shaohuzhang1@users.noreply.github.com> Date: Mon, 15 Jul 2024 17:39:47 +0800 Subject: [PATCH 01/29] =?UTF-8?q?feat:=20=E5=8D=87=E7=BA=A7django=204.2.14?= =?UTF-8?q?=20(#764)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 826ec71ca..070ce1308 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.11" -django = "4.2.13" +django = "4.2.14" djangorestframework = "^3.15.2" drf-yasg = "1.21.7" django-filter = "23.2" From be49147d4afd724daf345665112f62010cb3f21f Mon Sep 17 00:00:00 2001 From: shaohuzhang1 <80892890+shaohuzhang1@users.noreply.github.com> Date: Mon, 15 Jul 2024 20:10:50 +0800 Subject: [PATCH 02/29] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E3=80=90?= =?UTF-8?q?=E9=97=AE=E7=AD=94=E9=A1=B5=E9=9D=A2=E3=80=91-=20=E5=BD=93?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E5=85=B3=E8=81=94=E7=9A=84=E7=9F=A5=E8=AF=86?= =?UTF-8?q?=E5=BA=93=E4=B8=AD=E5=90=AB=E6=9C=89=E7=A6=81=E7=94=A8=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E7=9A=84=E6=96=87=E6=A1=A3=E6=97=B6=EF=BC=8C=E9=97=AE?= =?UTF-8?q?=E7=AD=94=E6=97=B6=E7=82=B9=E5=87=BB=E6=8D=A2=E4=B8=AA=E7=AD=94?= =?UTF-8?q?=E6=A1=88=E4=B8=8D=E4=BC=9A=E6=8D=A2=E4=B8=80=E6=89=B9=E5=91=BD?= =?UTF-8?q?=E4=B8=AD=E5=88=86=E6=AE=B5=20#759=20(#765)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../search_dataset_node/i_search_dataset_node.py | 16 +++++++++++++++- .../serializers/application_serializers.py | 2 ++ apps/embedding/vector/pg_vector.py | 4 ++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/apps/application/flow/step_node/search_dataset_node/i_search_dataset_node.py b/apps/application/flow/step_node/search_dataset_node/i_search_dataset_node.py index 0a134527c..436de5a96 100644 --- a/apps/application/flow/step_node/search_dataset_node/i_search_dataset_node.py +++ b/apps/application/flow/step_node/search_dataset_node/i_search_dataset_node.py @@ -13,6 +13,7 @@ from django.core import validators from rest_framework import serializers from application.flow.i_step_node import INode, NodeResult +from common.util.common import flat_map from common.util.field_message import ErrMessage @@ -43,6 +44,13 @@ class SearchDatasetStepNodeSerializer(serializers.Serializer): super().is_valid(raise_exception=True) +def get_paragraph_list(chat_record, node_id): + return flat_map([chat_record.details[key].get('paragraph_list', []) for key in chat_record.details if + (chat_record.details[ + key].get('type', '') == 'search-dataset-node') and chat_record.details[key].get( + 'paragraph_list', []) is not None and key == node_id]) + + class ISearchDatasetStepNode(INode): type = 'search-dataset-node' @@ -53,7 +61,13 @@ class ISearchDatasetStepNode(INode): question = self.workflow_manage.get_reference_field( self.node_params_serializer.data.get('question_reference_address')[0], self.node_params_serializer.data.get('question_reference_address')[1:]) - return self.execute(**self.node_params_serializer.data, question=str(question), exclude_paragraph_id_list=[]) + history_chat_record = self.flow_params_serializer.data.get('history_chat_record', []) + paragraph_id_list = [p.get('id') for p in flat_map( + [get_paragraph_list(chat_record, self.node.id) for chat_record in history_chat_record if + chat_record.problem_text == question])] + exclude_paragraph_id_list = list(set(paragraph_id_list)) + return self.execute(**self.node_params_serializer.data, question=str(question), + exclude_paragraph_id_list=exclude_paragraph_id_list) def execute(self, dataset_id_list, dataset_setting, question, exclude_paragraph_id_list=None, diff --git a/apps/application/serializers/application_serializers.py b/apps/application/serializers/application_serializers.py index 8ac962c95..d689448e1 100644 --- a/apps/application/serializers/application_serializers.py +++ b/apps/application/serializers/application_serializers.py @@ -579,6 +579,8 @@ class ApplicationSerializer(serializers.Serializer): 'dataset_id_list': dataset_id_list} def get_search_node(self, work_flow): + if work_flow is None: + return [] return [node for node in work_flow.get('nodes', []) if node.get('type', '') == 'search-dataset-node'] def update_search_node(self, work_flow, user_dataset_id_list: List): diff --git a/apps/embedding/vector/pg_vector.py b/apps/embedding/vector/pg_vector.py index 5c0d04536..e9a62ae57 100644 --- a/apps/embedding/vector/pg_vector.py +++ b/apps/embedding/vector/pg_vector.py @@ -105,9 +105,9 @@ class PGVector(BaseVectorStore): return [] query_set = QuerySet(Embedding).filter(dataset_id__in=dataset_id_list, is_active=is_active) if exclude_document_id_list is not None and len(exclude_document_id_list) > 0: - exclude_dict.__setitem__('document_id__in', exclude_document_id_list) + query_set = query_set.exclude(document_id__in=exclude_document_id_list) if exclude_paragraph_list is not None and len(exclude_paragraph_list) > 0: - exclude_dict.__setitem__('paragraph_id__in', exclude_paragraph_list) + query_set = query_set.exclude(paragraph_id__in=exclude_paragraph_list) query_set = query_set.exclude(**exclude_dict) for search_handle in search_handle_list: if search_handle.support(search_mode): From 5308ad9c89a453696cf0f44c9a8cde5fdfd0bb65 Mon Sep 17 00:00:00 2001 From: shaohuzhang1 <80892890+shaohuzhang1@users.noreply.github.com> Date: Mon, 15 Jul 2024 20:24:12 +0800 Subject: [PATCH 03/29] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=8D=A2?= =?UTF-8?q?=E4=B8=AA=E7=AD=94=E6=A1=88=E5=9C=A8=E5=B7=A5=E4=BD=9C=E6=B5=81?= =?UTF-8?q?=E4=B8=AD=E4=B8=80=E7=9B=B4=E7=94=9F=E6=95=88=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20(#766)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/application/flow/i_step_node.py | 4 +++- .../search_dataset_node/i_search_dataset_node.py | 13 ++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/apps/application/flow/i_step_node.py b/apps/application/flow/i_step_node.py index 0aa620e26..98bc5dcd1 100644 --- a/apps/application/flow/i_step_node.py +++ b/apps/application/flow/i_step_node.py @@ -105,12 +105,14 @@ class FlowParamsSerializer(serializers.Serializer): chat_record_id = serializers.CharField(required=True, error_messages=ErrMessage.char("对话记录id")) - stream = serializers.BooleanField(required=True, error_messages=ErrMessage.base("流式输出")) + stream = serializers.BooleanField(required=True, error_messages=ErrMessage.boolean("流式输出")) client_id = serializers.CharField(required=False, error_messages=ErrMessage.char("客户端id")) client_type = serializers.CharField(required=False, error_messages=ErrMessage.char("客户端类型")) + re_chat = serializers.BooleanField(required=True, error_messages=ErrMessage.boolean("换个答案")) + class INode: def __init__(self, node, workflow_params, workflow_manage): diff --git a/apps/application/flow/step_node/search_dataset_node/i_search_dataset_node.py b/apps/application/flow/step_node/search_dataset_node/i_search_dataset_node.py index 436de5a96..0de4e65a0 100644 --- a/apps/application/flow/step_node/search_dataset_node/i_search_dataset_node.py +++ b/apps/application/flow/step_node/search_dataset_node/i_search_dataset_node.py @@ -61,11 +61,14 @@ class ISearchDatasetStepNode(INode): question = self.workflow_manage.get_reference_field( self.node_params_serializer.data.get('question_reference_address')[0], self.node_params_serializer.data.get('question_reference_address')[1:]) - history_chat_record = self.flow_params_serializer.data.get('history_chat_record', []) - paragraph_id_list = [p.get('id') for p in flat_map( - [get_paragraph_list(chat_record, self.node.id) for chat_record in history_chat_record if - chat_record.problem_text == question])] - exclude_paragraph_id_list = list(set(paragraph_id_list)) + exclude_paragraph_id_list = [] + if self.flow_params_serializer.data.get('re_chat', False): + history_chat_record = self.flow_params_serializer.data.get('history_chat_record', []) + paragraph_id_list = [p.get('id') for p in flat_map( + [get_paragraph_list(chat_record, self.node.id) for chat_record in history_chat_record if + chat_record.problem_text == question])] + exclude_paragraph_id_list = list(set(paragraph_id_list)) + return self.execute(**self.node_params_serializer.data, question=str(question), exclude_paragraph_id_list=exclude_paragraph_id_list) From d554e0ae885bba67b7f775d4ef2826688891a272 Mon Sep 17 00:00:00 2001 From: shaohuzhang1 <80892890+shaohuzhang1@users.noreply.github.com> Date: Tue, 16 Jul 2024 10:33:18 +0800 Subject: [PATCH 04/29] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E7=9A=84=E5=88=86=E6=AE=B5=E7=BB=93=E6=9E=9C=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E4=B8=8D=E5=AF=B9=EF=BC=8C=E4=B8=8D=E6=98=AF=E6=8C=89?= =?UTF-8?q?=E7=85=A7=E5=91=BD=E4=B8=AD=E9=AB=98=E4=BD=8E=E9=A1=BA=E5=BA=8F?= =?UTF-8?q?=E6=8E=92=E5=BA=8F[BUG]=20#746=20(#770)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../search_dataset_node/impl/base_search_dataset_node.py | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/application/flow/step_node/search_dataset_node/impl/base_search_dataset_node.py b/apps/application/flow/step_node/search_dataset_node/impl/base_search_dataset_node.py index 20e0af9fc..191b8c15b 100644 --- a/apps/application/flow/step_node/search_dataset_node/impl/base_search_dataset_node.py +++ b/apps/application/flow/step_node/search_dataset_node/impl/base_search_dataset_node.py @@ -40,6 +40,7 @@ class BaseSearchDatasetNode(ISearchDatasetStepNode): return NodeResult({'paragraph_list': [], 'is_hit_handling_method': []}, {}) paragraph_list = self.list_paragraph(embedding_list, vector) result = [self.reset_paragraph(paragraph, embedding_list) for paragraph in paragraph_list] + result = sorted(result, key=lambda p: p.get('similarity'), reverse=True) return NodeResult({'paragraph_list': result, 'is_hit_handling_method_list': [row for row in result if row.get('is_hit_handling_method')], 'data': '\n'.join([paragraph.get('content') for paragraph in paragraph_list]), From 32498114282a0d4afbf3bbc8eb305a1c17f01700 Mon Sep 17 00:00:00 2001 From: shaohuzhang1 <80892890+shaohuzhang1@users.noreply.github.com> Date: Tue, 16 Jul 2024 10:59:13 +0800 Subject: [PATCH 05/29] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=9C=A8?= =?UTF-8?q?=E7=BA=BF=E7=9F=A5=E8=AF=86=E5=BA=93=E7=88=AC=E5=8F=96=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E5=90=8D=E8=B6=85=E8=BF=87128=E4=B8=AA=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E6=8A=A5=E9=94=99=20#706=20(#778)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/dataset/serializers/document_serializers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/dataset/serializers/document_serializers.py b/apps/dataset/serializers/document_serializers.py index 9496ac7e1..07a39b578 100644 --- a/apps/dataset/serializers/document_serializers.py +++ b/apps/dataset/serializers/document_serializers.py @@ -656,13 +656,13 @@ class DocumentSerializers(ApiMixin, serializers.Serializer): paragraphs = get_split_model('web.md').parse(response.content) # 插入 DocumentSerializers.Create(data={'dataset_id': dataset_id}).save( - {'name': source_url, 'paragraphs': paragraphs, + {'name': source_url[0:128], 'paragraphs': paragraphs, 'meta': {'source_url': source_url, 'selector': selector}, 'type': Type.web}, with_valid=True) except Exception as e: logging.getLogger("max_kb_error").error(f'{str(e)}:{traceback.format_exc()}') else: - Document(name=source_url, + Document(name=source_url[0:128], meta={'source_url': source_url, 'selector': selector}, type=Type.web, char_length=0, From ee9e2393854bff5a9ebc0b2eb51e6d6d8fa03f6f Mon Sep 17 00:00:00 2001 From: wxg0103 <727495428@qq.com> Date: Tue, 16 Jul 2024 16:20:57 +0800 Subject: [PATCH 06/29] refactor: user --- apps/users/serializers/user_serializers.py | 3 ++- ui/src/views/user-manage/index.vue | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/users/serializers/user_serializers.py b/apps/users/serializers/user_serializers.py index 291449963..0d595d485 100644 --- a/apps/users/serializers/user_serializers.py +++ b/apps/users/serializers/user_serializers.py @@ -497,7 +497,7 @@ class UserSerializer(ApiMixin, serializers.ModelSerializer): class UserInstanceSerializer(ApiMixin, serializers.ModelSerializer): class Meta: model = User - fields = ['id', 'username', 'email', 'phone', 'is_active', 'role', 'nick_name', 'create_time', 'update_time'] + fields = ['id', 'username', 'email', 'phone', 'is_active', 'role', 'nick_name', 'create_time', 'update_time', 'source'] @staticmethod def get_response_body_api(): @@ -512,6 +512,7 @@ class UserInstanceSerializer(ApiMixin, serializers.ModelSerializer): 'phone': openapi.Schema(type=openapi.TYPE_STRING, title="手机号", description="手机号"), 'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否激活", description="是否激活"), 'role': openapi.Schema(type=openapi.TYPE_STRING, title="角色", description="角色"), + 'source': openapi.Schema(type=openapi.TYPE_STRING, title="来源", description="来源"), 'nick_name': openapi.Schema(type=openapi.TYPE_STRING, title="姓名", description="姓名"), 'create_time': openapi.Schema(type=openapi.TYPE_STRING, title="创建时间", description="修改时间"), 'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间", description="修改时间") diff --git a/ui/src/views/user-manage/index.vue b/ui/src/views/user-manage/index.vue index af8a4be89..5d641ba9a 100644 --- a/ui/src/views/user-manage/index.vue +++ b/ui/src/views/user-manage/index.vue @@ -25,6 +25,11 @@ + + + - + - \ No newline at end of file + diff --git a/ui/src/views/theme/index.vue b/ui/src/views/theme/index.vue index 69b1ba901..85d662e29 100644 --- a/ui/src/views/theme/index.vue +++ b/ui/src/views/theme/index.vue @@ -1,774 +1,177 @@ - diff --git a/ui/src/workflow/common/NodeContainer.vue b/ui/src/workflow/common/NodeContainer.vue index b1c772496..0f04d357c 100644 --- a/ui/src/workflow/common/NodeContainer.vue +++ b/ui/src/workflow/common/NodeContainer.vue @@ -1,7 +1,7 @@ @@ -29,7 +48,9 @@ const props = defineProps({ height: 100vh; .login-image { - object-fit: cover; + background-repeat: no-repeat; + background-position: center; + background-size: cover; width: 100%; height: 100%; } diff --git a/ui/src/components/logo/LogoFull.vue b/ui/src/components/logo/LogoFull.vue index 24169a2f8..c65499aaf 100644 --- a/ui/src/components/logo/LogoFull.vue +++ b/ui/src/components/logo/LogoFull.vue @@ -1,59 +1,62 @@ From 7c3f8884be63324633171e01612d4303042ba5e2 Mon Sep 17 00:00:00 2001 From: wangdan-fit2cloud Date: Wed, 17 Jul 2024 15:24:53 +0800 Subject: [PATCH 23/29] =?UTF-8?q?feat:=20=E5=85=B3=E4=BA=8E=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/src/api/license.ts | 24 +++ ui/src/enums/common.ts | 5 + .../components/top-bar/avatar/AboutDialog.vue | 99 +++++++--- ui/src/locales/lang/zh_CN/layout.ts | 2 +- ui/src/styles/app.scss | 4 + ui/src/views/theme/index.vue | 184 +++++++++--------- 6 files changed, 197 insertions(+), 121 deletions(-) create mode 100644 ui/src/api/license.ts diff --git a/ui/src/api/license.ts b/ui/src/api/license.ts new file mode 100644 index 000000000..16e5acdf6 --- /dev/null +++ b/ui/src/api/license.ts @@ -0,0 +1,24 @@ +import { Result } from '@/request/Result' +import { get, post, del, put } from '@/request/index' +import { type Ref } from 'vue' + +const prefix = '/license' + +/** + * 获得license信息 + */ +const getLicense: (loading?: Ref) => Promise> = (loading) => { + return get(`${prefix}/profile`, undefined, loading) +} +/** + * 更新license信息 + * @param 参数 license_file:file + */ +const putLicense: (data: any, loading?: Ref) => Promise> = (data, loading) => { + return put(`${prefix}/profile`, data, undefined, loading) +} + +export default { + getLicense, + putLicense +} diff --git a/ui/src/enums/common.ts b/ui/src/enums/common.ts index 3afd8fc26..e63bf033f 100644 --- a/ui/src/enums/common.ts +++ b/ui/src/enums/common.ts @@ -14,3 +14,8 @@ export enum ValidCount { Dataset = 50, User = 2 } + +export enum EditionType { + Standard = '社区版', + Enterprise = '专业版' +} diff --git a/ui/src/layout/components/top-bar/avatar/AboutDialog.vue b/ui/src/layout/components/top-bar/avatar/AboutDialog.vue index 35e1f5308..16491b937 100644 --- a/ui/src/layout/components/top-bar/avatar/AboutDialog.vue +++ b/ui/src/layout/components/top-bar/avatar/AboutDialog.vue @@ -9,31 +9,55 @@ -
- -
- - {{ $t('layout.topbar.wiki') }} -
-
- -
- - {{ $t('layout.topbar.github') }} -
-
- -
- - {{ $t('layout.topbar.forum') }} -
-
+
+
+ 授权给{{ licenseInfo?.corporation || '-' }} +
+
+ ISV{{ licenseInfo?.isv || '-' }} +
+
+ 过期时间{{ licenseInfo?.expired || '-' }} +
+
+ 版本{{ + licenseInfo?.edition ? EditionType[licenseInfo.edition as keyof typeof EditionType] : '-' + }} +
+
+ 版本号{{ licenseInfo?.licenseVersion || '-' }} +
+
+ 序列号{{ licenseInfo?.serialNo || '-' }} +
+
+ 备注{{ licenseInfo?.remark || '-' }} +
+ +
+ + 更新 License + + + 获取技术支持 +
-
{{ $t('layout.topbar.avatar.version') }}:{{ user.version }}
+ +