From 1639d4b31c5f479fb64d094c5df57bf83bf2889b Mon Sep 17 00:00:00 2001 From: CaptainB Date: Thu, 3 Jul 2025 11:58:12 +0800 Subject: [PATCH] feat: enhance file upload with source_id and source_type metadata --- .../impl/base_document_extract_node.py | 9 +++++++-- .../impl/base_image_generate_node.py | 8 +++++++- .../impl/base_text_to_speech_node.py | 8 +++++++- 3 files changed, 21 insertions(+), 4 deletions(-) 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 4d52d2d1f..1657dacaf 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 @@ -7,7 +7,7 @@ from django.db.models import QuerySet from application.flow.i_step_node import NodeResult from application.flow.step_node.document_extract_node.i_document_extract_node import IDocumentExtractNode -from knowledge.models import File +from knowledge.models import File, FileSourceType from knowledge.serializers.document import split_handles, parse_table_handle_list, FileBufferHandle from oss.serializers.file import FileSerializer @@ -62,7 +62,12 @@ class BaseDocumentExtractNode(IDocumentExtractNode): 'file_id': str(image.id) } file = bytes_to_uploaded_file(image.image, image.image_name) - FileSerializer(data={'file': file, 'meta': meta}).upload() + FileSerializer(data={ + 'file': file, + 'meta': meta, + 'source_id': meta['application_id'], + 'source_type': FileSourceType.APPLICATION.value + }).upload() for doc in document: file = QuerySet(File).filter(id=doc['file_id']).first() diff --git a/apps/application/flow/step_node/image_generate_step_node/impl/base_image_generate_node.py b/apps/application/flow/step_node/image_generate_step_node/impl/base_image_generate_node.py index 3de9056a2..8aef15397 100644 --- a/apps/application/flow/step_node/image_generate_step_node/impl/base_image_generate_node.py +++ b/apps/application/flow/step_node/image_generate_step_node/impl/base_image_generate_node.py @@ -8,6 +8,7 @@ from langchain_core.messages import BaseMessage, HumanMessage, AIMessage from application.flow.i_step_node import NodeResult from application.flow.step_node.image_generate_step_node.i_image_generate_node import IImageGenerateNode from common.utils.common import bytes_to_uploaded_file +from knowledge.models import FileSourceType from oss.serializers.file import FileSerializer from models_provider.tools import get_model_instance_by_model_workspace_id @@ -45,7 +46,12 @@ class BaseImageGenerateNode(IImageGenerateNode): 'chat_id': chat_id, 'application_id': str(application.id) if application.id else None, } - file_url = FileSerializer(data={'file': file, 'meta': meta}).upload() + file_url = FileSerializer(data={ + 'file': file, + 'meta': meta, + 'source_id': meta['application_id'], + 'source_type': FileSourceType.APPLICATION.value + }).upload() file_urls.append(file_url) self.context['image_list'] = [{'file_id': path.split('/')[-1], 'url': path} for path in file_urls] answer = ' '.join([f"![Image]({path})" for path in file_urls]) diff --git a/apps/application/flow/step_node/text_to_speech_step_node/impl/base_text_to_speech_node.py b/apps/application/flow/step_node/text_to_speech_step_node/impl/base_text_to_speech_node.py index 6c10a0d36..e673d7aaa 100644 --- a/apps/application/flow/step_node/text_to_speech_step_node/impl/base_text_to_speech_node.py +++ b/apps/application/flow/step_node/text_to_speech_step_node/impl/base_text_to_speech_node.py @@ -6,6 +6,7 @@ from django.core.files.uploadedfile import InMemoryUploadedFile from application.flow.i_step_node import NodeResult from application.flow.step_node.text_to_speech_step_node.i_text_to_speech_node import ITextToSpeechNode +from knowledge.models import FileSourceType from models_provider.tools import get_model_instance_by_model_workspace_id from oss.serializers.file import FileSerializer @@ -55,7 +56,12 @@ class BaseTextToSpeechNode(ITextToSpeechNode): 'chat_id': chat_id, 'application_id': str(application.id) if application.id else None, } - file_url = FileSerializer(data={'file': file, 'meta': meta}).upload() + file_url = FileSerializer(data={ + 'file': file, + 'meta': meta, + 'source_id': meta['application_id'], + 'source_type': FileSourceType.APPLICATION.value + }).upload() # 拼接一个audio标签的src属性 audio_label = f'' file_id = file_url.split('/')[-1]