diff --git a/apps/application/flow/step_node/document_extract_node/impl/base_document_extract_node.py b/apps/application/flow/step_node/document_extract_node/impl/base_document_extract_node.py index 2663af097..f450a1dd0 100644 --- a/apps/application/flow/step_node/document_extract_node/impl/base_document_extract_node.py +++ b/apps/application/flow/step_node/document_extract_node/impl/base_document_extract_node.py @@ -14,8 +14,8 @@ class BaseDocumentExtractNode(IDocumentExtractNode): get_buffer = FileBufferHandle().get_buffer self.context['document_list'] = document - content = '' - splitter = '\n-----------------------------------\n' + content = [] + splitter = '\n`-----------------------------------`\n' if document is None: return NodeResult({'content': content}, {}) @@ -29,10 +29,10 @@ class BaseDocumentExtractNode(IDocumentExtractNode): # 回到文件头 buffer.seek(0) file_content = split_handle.get_content(buffer) - content += splitter + '## ' + doc['name'] + '\n' + file_content + content.append( '## ' + doc['name'] + '\n' + file_content) break - return NodeResult({'content': content}, {}) + return NodeResult({'content': splitter.join(content)}, {}) def get_details(self, index: int, **kwargs): return { diff --git a/apps/application/flow/step_node/start_node/impl/base_start_node.py b/apps/application/flow/step_node/start_node/impl/base_start_node.py index 6388e4dfd..4f95656d2 100644 --- a/apps/application/flow/step_node/start_node/impl/base_start_node.py +++ b/apps/application/flow/step_node/start_node/impl/base_start_node.py @@ -77,5 +77,6 @@ class BaseStartStepNode(IStarNode): 'status': self.status, 'err_message': self.err_message, 'image_list': self.context.get('image'), + 'document_list': self.context.get('document'), 'global_fields': global_fields } diff --git a/apps/application/serializers/chat_serializers.py b/apps/application/serializers/chat_serializers.py index f3710fe00..f7bb11f24 100644 --- a/apps/application/serializers/chat_serializers.py +++ b/apps/application/serializers/chat_serializers.py @@ -38,7 +38,7 @@ from common.util.field_message import ErrMessage from common.util.file_util import get_file_content from common.util.lock import try_lock, un_lock from dataset.models import Document, Problem, Paragraph, ProblemParagraphMapping -from dataset.serializers.common_serializers import get_embedding_model_id_by_dataset_id +from dataset.serializers.common_serializers import get_embedding_model_id_by_dataset_id, update_document_char_length from dataset.serializers.paragraph_serializers import ParagraphSerializers from embedding.task import embedding_by_paragraph, embedding_by_paragraph_list from setting.models import Model @@ -620,6 +620,7 @@ class ChatRecordSerializer(serializers.Serializer): # 插入关联问题 problem_paragraph_mapping.save() chat_record.improve_paragraph_id_list.append(paragraph.id) + update_document_char_length(document_id) # 添加标注 chat_record.save() return ChatRecordSerializerModel(chat_record).data, paragraph.id, dataset_id @@ -718,5 +719,6 @@ class ChatRecordSerializer(serializers.Serializer): # 批量保存聊天记录 ChatRecord.objects.bulk_update(chat_record_list, ['improve_paragraph_id_list']) + update_document_char_length(document_id) return paragraph_ids, dataset_id diff --git a/apps/common/handle/impl/table/csv_parse_table_handle.py b/apps/common/handle/impl/table/csv_parse_table_handle.py index c3a85db86..dcd971839 100644 --- a/apps/common/handle/impl/table/csv_parse_table_handle.py +++ b/apps/common/handle/impl/table/csv_parse_table_handle.py @@ -41,4 +41,4 @@ class CsvSplitHandle(BaseParseTableHandle): return buffer.decode(detect(buffer)['encoding']) except BaseException as e: max_kb.error(f'csv split handle error: {e}') - return [{'name': file.name, 'paragraphs': []}] \ No newline at end of file + return f'error: {e}' \ No newline at end of file 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 a3ef14443..0fee4e35b 100644 --- a/apps/common/handle/impl/table/xls_parse_table_handle.py +++ b/apps/common/handle/impl/table/xls_parse_table_handle.py @@ -63,21 +63,26 @@ class XlsSplitHandle(BaseParseTableHandle): def get_content(self, file): # 打开 .xls 文件 - workbook = xlrd.open_workbook(file_contents=file.read(), formatting_info=True) - sheets = workbook.sheets() - md_tables = '' - for sheet in sheets: + try: + workbook = xlrd.open_workbook(file_contents=file.read(), formatting_info=True) + sheets = workbook.sheets() + md_tables = '' + for sheet in sheets: - # 获取表头和内容 - headers = sheet.row_values(0) - data = [sheet.row_values(row_idx) for row_idx in range(1, sheet.nrows)] + # 获取表头和内容 + headers = sheet.row_values(0) + data = [sheet.row_values(row_idx) for row_idx in range(1, sheet.nrows)] - # 构建 Markdown 表格 - md_table = '| ' + ' | '.join(headers) + ' |\n' - md_table += '| ' + ' | '.join(['---'] * len(headers)) + ' |\n' - for row in data: - # 将每个单元格中的内容替换换行符为
以保留原始格式 - md_table += '| ' + ' | '.join([str(cell).replace('\n', '
') if cell else '' for cell in row]) + ' |\n' - md_tables += md_table + '\n\n' + # 构建 Markdown 表格 + md_table = '| ' + ' | '.join(headers) + ' |\n' + md_table += '| ' + ' | '.join(['---'] * len(headers)) + ' |\n' + for row in data: + # 将每个单元格中的内容替换换行符为
以保留原始格式 + md_table += '| ' + ' | '.join( + [str(cell).replace('\n', '
') if cell else '' for cell in row]) + ' |\n' + md_tables += md_table + '\n\n' - return md_tables + return md_tables + except Exception as e: + max_kb.error(f'excel split handle error: {e}') + return f'error: {e}' diff --git a/apps/common/handle/impl/table/xlsx_parse_table_handle.py b/apps/common/handle/impl/table/xlsx_parse_table_handle.py index e92d3c11a..3fd40b2d1 100644 --- a/apps/common/handle/impl/table/xlsx_parse_table_handle.py +++ b/apps/common/handle/impl/table/xlsx_parse_table_handle.py @@ -75,28 +75,32 @@ class XlsxSplitHandle(BaseParseTableHandle): def get_content(self, file): - # 加载 Excel 文件 - workbook = load_workbook(file) - md_tables = '' - # 如果未指定 sheet_name,则使用第一个工作表 - for sheetname in workbook.sheetnames: - sheet = workbook[sheetname] if sheetname else workbook.active + try: + # 加载 Excel 文件 + workbook = load_workbook(file) + md_tables = '' + # 如果未指定 sheet_name,则使用第一个工作表 + for sheetname in workbook.sheetnames: + sheet = workbook[sheetname] if sheetname else workbook.active - # 获取工作表的所有行 - rows = list(sheet.iter_rows(values_only=True)) - if not rows: - continue + # 获取工作表的所有行 + rows = list(sheet.iter_rows(values_only=True)) + if not rows: + continue - # 提取表头和内容 - headers = rows[0] - data = rows[1:] + # 提取表头和内容 + headers = rows[0] + data = rows[1:] - # 构建 Markdown 表格 - md_table = '| ' + ' | '.join(headers) + ' |\n' - md_table += '| ' + ' | '.join(['---'] * len(headers)) + ' |\n' - for row in data: - md_table += '| ' + ' | '.join( - [str(cell).replace('\n', '
') if cell is not None else '' for cell in row]) + ' |\n' + # 构建 Markdown 表格 + md_table = '| ' + ' | '.join(headers) + ' |\n' + md_table += '| ' + ' | '.join(['---'] * len(headers)) + ' |\n' + for row in data: + md_table += '| ' + ' | '.join( + [str(cell).replace('\n', '
') if cell is not None else '' for cell in row]) + ' |\n' - md_tables += md_table + '\n\n' - return md_tables \ No newline at end of file + md_tables += md_table + '\n\n' + return md_tables + except Exception as e: + max_kb.error(f'excel split handle error: {e}') + return f'error: {e}' diff --git a/ui/src/assets/icon_docs.svg b/ui/src/assets/icon_docs.svg new file mode 100644 index 000000000..9bec0be4a --- /dev/null +++ b/ui/src/assets/icon_docs.svg @@ -0,0 +1,4 @@ + + + + diff --git a/ui/src/assets/icon_file-doc.svg b/ui/src/assets/icon_file-doc.svg new file mode 100644 index 000000000..86ac2d3f1 --- /dev/null +++ b/ui/src/assets/icon_file-doc.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ui/src/assets/icon_file-image.svg b/ui/src/assets/icon_file-image.svg new file mode 100644 index 000000000..4511c36f5 --- /dev/null +++ b/ui/src/assets/icon_file-image.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ui/src/assets/icon_image.svg b/ui/src/assets/icon_image.svg new file mode 100644 index 000000000..f6ee5f551 --- /dev/null +++ b/ui/src/assets/icon_image.svg @@ -0,0 +1,4 @@ + + + + diff --git a/ui/src/components/ai-chat/ExecutionDetailDialog.vue b/ui/src/components/ai-chat/ExecutionDetailDialog.vue index dd403b15d..2b8de6545 100644 --- a/ui/src/components/ai-chat/ExecutionDetailDialog.vue +++ b/ui/src/components/ai-chat/ExecutionDetailDialog.vue @@ -135,8 +135,7 @@ v-if=" item.type == WorkflowType.AiChat || item.type == WorkflowType.Question || - item.type == WorkflowType.Application || - item.type == WorkflowType.ImageUnderstandNode + item.type == WorkflowType.Application " >
- {{ item.type == WorkflowType.Application ? '应用回答' : 'AI 回答' }} + {{ item.type == WorkflowType.Application ? '参数输出' : 'AI 回答' }}
+ + + + +