diff --git a/apps/application/flow/step_node/application_node/i_application_node.py b/apps/application/flow/step_node/application_node/i_application_node.py index b11fa0023..d0184d4a3 100644 --- a/apps/application/flow/step_node/application_node/i_application_node.py +++ b/apps/application/flow/step_node/application_node/i_application_node.py @@ -12,6 +12,8 @@ class ApplicationNodeSerializer(serializers.Serializer): question_reference_address = serializers.ListField(required=True, error_messages=ErrMessage.list("用户问题")) api_input_field_list = serializers.ListField(required=False, error_messages=ErrMessage.list("api输入字段")) user_input_field_list = serializers.ListField(required=False, error_messages=ErrMessage.uuid("用户输入字段")) + image_list = serializers.ListField(required=False, error_messages=ErrMessage.list("图片")) + document_list = serializers.ListField(required=False, error_messages=ErrMessage.list("文档")) class IApplicationNode(INode): @@ -31,10 +33,27 @@ class IApplicationNode(INode): for user_input_field in self.node_params_serializer.data.get('user_input_field_list', []): kwargs[user_input_field['field']] = self.workflow_manage.get_reference_field(user_input_field['value'][0], user_input_field['value'][1:]) - + # 判断是否包含这个属性 + app_document_list = self.node_params_serializer.data.get('document_list', []) + if app_document_list and len(app_document_list) > 0: + app_document_list = self.workflow_manage.get_reference_field( + app_document_list[0], + app_document_list[1:]) + for document in app_document_list: + if 'file_id' not in document: + raise ValueError("参数值错误: 上传的文档中缺少file_id") + app_image_list = self.node_params_serializer.data.get('image_list', []) + if app_image_list and len(app_image_list) > 0: + app_image_list = self.workflow_manage.get_reference_field( + app_image_list[0], + app_image_list[1:]) + for image in app_image_list: + if 'file_id' not in image: + raise ValueError("参数值错误: 上传的图片中缺少file_id") return self.execute(**self.node_params_serializer.data, **self.flow_params_serializer.data, + app_document_list=app_document_list, app_image_list=app_image_list, message=str(question), **kwargs) def execute(self, application_id, message, chat_id, chat_record_id, stream, re_chat, client_id, client_type, - **kwargs) -> NodeResult: + app_document_list=None, app_image_list=None, **kwargs) -> NodeResult: pass diff --git a/apps/application/flow/step_node/application_node/impl/base_application_node.py b/apps/application/flow/step_node/application_node/impl/base_application_node.py index f1abca40d..999e700d4 100644 --- a/apps/application/flow/step_node/application_node/impl/base_application_node.py +++ b/apps/application/flow/step_node/application_node/impl/base_application_node.py @@ -71,6 +71,7 @@ class BaseApplicationNode(IApplicationNode): self.answer_text = details.get('answer') def execute(self, application_id, message, chat_id, chat_record_id, stream, re_chat, client_id, client_type, + app_document_list=None, app_image_list=None, **kwargs) -> NodeResult: from application.serializers.chat_message_serializers import ChatMessageSerializer # 生成嵌入应用的chat_id @@ -79,13 +80,20 @@ class BaseApplicationNode(IApplicationNode): 'application_id': application_id, 'abstract': message }) + if app_document_list is None: + app_document_list = [] + if app_image_list is None: + app_image_list = [] response = ChatMessageSerializer( data={'chat_id': current_chat_id, 'message': message, 're_chat': re_chat, 'stream': stream, 'application_id': application_id, 'client_id': client_id, - 'client_type': client_type, 'form_data': kwargs}).chat(base_to_response=OpenaiToResponse()) + 'client_type': client_type, + 'document_list': app_document_list, + 'image_list': app_image_list, + 'form_data': kwargs}).chat(base_to_response=OpenaiToResponse()) if response.status_code == 200: if stream: content_generator = response.streaming_content diff --git a/ui/src/views/application-workflow/component/DropdownMenu.vue b/ui/src/views/application-workflow/component/DropdownMenu.vue index 333815064..5f91072ff 100644 --- a/ui/src/views/application-workflow/component/DropdownMenu.vue +++ b/ui/src/views/application-workflow/component/DropdownMenu.vue @@ -149,13 +149,20 @@ function clickNodes(item: any, data?: any, type?: string) { } if (type == 'application') { if (isWorkFlow(data.type)) { - console.log(data.work_flow.nodes[0].properties.api_input_field_list) + const nodeData = data.work_flow.nodes[0].properties.node_data + const fileUploadSetting = nodeData.file_upload_setting item['properties']['node_data'] = { name: data.name, icon: data.icon, application_id: data.id, api_input_field_list: data.work_flow.nodes[0].properties.api_input_field_list, - user_input_field_list: data.work_flow.nodes[0].properties.user_input_field_list + user_input_field_list: data.work_flow.nodes[0].properties.user_input_field_list, + ...(!fileUploadSetting + ? {} + : { + ...(fileUploadSetting.document ? { document_list: [] } : {}), + ...(fileUploadSetting.image ? { image_list: [] } : {}) + }) } } else { item['properties']['node_data'] = { @@ -186,12 +193,20 @@ function onmousedown(item: any, data?: any, type?: string) { } if (type == 'application') { if (isWorkFlow(data.type)) { + const nodeData = data.work_flow.nodes[0].properties.node_data + const fileUploadSetting = nodeData.file_upload_setting item['properties']['node_data'] = { name: data.name, icon: data.icon, application_id: data.id, api_input_field_list: data.work_flow.nodes[0].properties.api_input_field_list, - user_input_field_list: data.work_flow.nodes[0].properties.user_input_field_list + user_input_field_list: data.work_flow.nodes[0].properties.user_input_field_list, + ...(!fileUploadSetting + ? {} + : { + ...(fileUploadSetting.document ? { document_list: [] } : {}), + ...(fileUploadSetting.image ? { image_list: [] } : {}) + }) } } else { item['properties']['node_data'] = { diff --git a/ui/src/views/application/index.vue b/ui/src/views/application/index.vue index 849fbf8e6..643ae8a8b 100644 --- a/ui/src/views/application/index.vue +++ b/ui/src/views/application/index.vue @@ -3,7 +3,12 @@

{{ $t('views.application.applicationList.title') }}

- +
diff --git a/ui/src/views/dataset/index.vue b/ui/src/views/dataset/index.vue index 03de2ea81..9075316b2 100644 --- a/ui/src/views/dataset/index.vue +++ b/ui/src/views/dataset/index.vue @@ -3,7 +3,12 @@

知识库

- +
diff --git a/ui/src/views/function-lib/index.vue b/ui/src/views/function-lib/index.vue index e5d7f8cfc..6ead54f04 100644 --- a/ui/src/views/function-lib/index.vue +++ b/ui/src/views/function-lib/index.vue @@ -3,7 +3,12 @@

函数库

- +
diff --git a/ui/src/workflow/nodes/application-node/index.vue b/ui/src/workflow/nodes/application-node/index.vue index 922da2ba2..5ae249e9e 100644 --- a/ui/src/workflow/nodes/application-node/index.vue +++ b/ui/src/workflow/nodes/application-node/index.vue @@ -27,6 +27,44 @@ v-model="form_data.question_reference_address" /> + + + + + + + +
-
() @@ -124,7 +163,6 @@ const validate = () => { } onMounted(() => { - console.log(applicationNodeFormRef.value) set(props.nodeModel, 'validate', validate) })