Bugfix/Prevent empty user message when using STT (#4280)

prevent empty user message when using STT
This commit is contained in:
Henry Heng
2025-04-11 13:15:17 +08:00
committed by GitHub
parent 5faff52053
commit d53b1b657f
2 changed files with 11 additions and 9 deletions
+9 -8
View File
@@ -5,7 +5,7 @@ import * as path from 'path'
import { JSDOM } from 'jsdom' import { JSDOM } from 'jsdom'
import { z } from 'zod' import { z } from 'zod'
import { DataSource } from 'typeorm' import { DataSource } from 'typeorm'
import { ICommonObject, IDatabaseEntity, IDocument, IMessage, INodeData, IVariable, MessageContentImageUrl } from './Interface' import { ICommonObject, IDatabaseEntity, IFileUpload, IMessage, INodeData, IVariable, MessageContentImageUrl } from './Interface'
import { AES, enc } from 'crypto-js' import { AES, enc } from 'crypto-js'
import { omit } from 'lodash' import { omit } from 'lodash'
import { AIMessage, HumanMessage, BaseMessage } from '@langchain/core/messages' import { AIMessage, HumanMessage, BaseMessage } from '@langchain/core/messages'
@@ -718,10 +718,10 @@ export const mapChatMessageToBaseMessage = async (chatmessages: any[] = []): Pro
// example: [{"type":"stored-file","name":"0_DiXc4ZklSTo3M8J4.jpg","mime":"image/jpeg"}] // example: [{"type":"stored-file","name":"0_DiXc4ZklSTo3M8J4.jpg","mime":"image/jpeg"}]
try { try {
let messageWithFileUploads = '' let messageWithFileUploads = ''
const uploads = JSON.parse(message.fileUploads) const uploads: IFileUpload[] = JSON.parse(message.fileUploads)
const imageContents: MessageContentImageUrl[] = [] const imageContents: MessageContentImageUrl[] = []
for (const upload of uploads) { for (const upload of uploads) {
if (upload.type === 'stored-file' && upload.mime.startsWith('image')) { if (upload.type === 'stored-file' && upload.mime.startsWith('image/')) {
const fileData = await getFileFromStorage(upload.name, message.chatflowid, message.chatId) const fileData = await getFileFromStorage(upload.name, message.chatflowid, message.chatId)
// as the image is stored in the server, read the file and convert it to base64 // as the image is stored in the server, read the file and convert it to base64
const bf = 'data:' + upload.mime + ';base64,' + fileData.toString('base64') const bf = 'data:' + upload.mime + ';base64,' + fileData.toString('base64')
@@ -732,7 +732,7 @@ export const mapChatMessageToBaseMessage = async (chatmessages: any[] = []): Pro
url: bf url: bf
} }
}) })
} else if (upload.type === 'url' && upload.mime.startsWith('image')) { } else if (upload.type === 'url' && upload.mime.startsWith('image') && upload.data) {
imageContents.push({ imageContents.push({
type: 'image_url', type: 'image_url',
image_url: { image_url: {
@@ -748,14 +748,15 @@ export const mapChatMessageToBaseMessage = async (chatmessages: any[] = []): Pro
chatflowid: message.chatflowid, chatflowid: message.chatflowid,
chatId: message.chatId chatId: message.chatId
} }
let fileInputFieldFromMimeType = 'txtFile'
fileInputFieldFromMimeType = mapMimeTypeToInputField(upload.mime)
const nodeData = { const nodeData = {
inputs: { inputs: {
txtFile: `FILE-STORAGE::${JSON.stringify([upload.name])}` [fileInputFieldFromMimeType]: `FILE-STORAGE::${JSON.stringify([upload.name])}`
} }
} }
const documents: IDocument[] = await fileLoaderNodeInstance.init(nodeData, '', options) const documents: string = await fileLoaderNodeInstance.init(nodeData, '', options)
const pageContents = documents.map((doc) => doc.pageContent).join('\n') messageWithFileUploads += `<doc name='${upload.name}'>${documents}</doc>\n\n`
messageWithFileUploads += `<doc name='${upload.name}'>${pageContents}</doc>\n\n`
} }
} }
const messageContent = messageWithFileUploads ? `${messageWithFileUploads}\n\n${message.content}` : message.content const messageContent = messageWithFileUploads ? `${messageWithFileUploads}\n\n${message.content}` : message.content
+2 -1
View File
@@ -244,7 +244,7 @@ export const executeFlow = async ({
...incomingInput ...incomingInput
} }
const question = incomingInput.question || '' // Ensure question is never undefined let question = incomingInput.question || '' // Ensure question is never undefined
let overrideConfig = incomingInput.overrideConfig ?? {} let overrideConfig = incomingInput.overrideConfig ?? {}
const uploads = incomingInput.uploads const uploads = incomingInput.uploads
const prependMessages = incomingInput.history ?? [] const prependMessages = incomingInput.history ?? []
@@ -308,6 +308,7 @@ export const executeFlow = async ({
logger.debug(`Speech to text result: ${speechToTextResult}`) logger.debug(`Speech to text result: ${speechToTextResult}`)
if (speechToTextResult) { if (speechToTextResult) {
incomingInput.question = speechToTextResult incomingInput.question = speechToTextResult
question = speechToTextResult
} }
} }
} }