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
"
>
+ {{ history.role }}:
+
+
+
+
图片:
+提示词:
+ {{ item.question || '-' }} +