diff --git a/backend/danswer/chat/process_message.py b/backend/danswer/chat/process_message.py index 3fd38904b..e0709125b 100644 --- a/backend/danswer/chat/process_message.py +++ b/backend/danswer/chat/process_message.py @@ -835,7 +835,9 @@ def stream_chat_message_objects( tool_name=tool_result.tool_name, tool_arguments=tool_result.tool_args, tool_result=tool_result.tool_result, - ), + ) + if tool_result + else None, ) logger.debug("Committing messages") diff --git a/backend/danswer/db/chat.py b/backend/danswer/db/chat.py index 3720a998b..9bb48c6b1 100644 --- a/backend/danswer/db/chat.py +++ b/backend/danswer/db/chat.py @@ -481,7 +481,7 @@ def create_new_chat_message( message_type=message_type, citations=citations, files=files, - tool_calls=tool_call, + tool_call=tool_call, error=error, alternate_assistant_id=alternate_assistant_id, alternate_model=alternate_model, diff --git a/web/package-lock.json b/web/package-lock.json index 52b463e09..48ac21d64 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -975,6 +975,126 @@ "node": ">= 10" } }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz", + "integrity": "sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz", + "integrity": "sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz", + "integrity": "sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz", + "integrity": "sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz", + "integrity": "sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz", + "integrity": "sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz", + "integrity": "sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz", + "integrity": "sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", diff --git a/web/src/app/chat/ChatPage.tsx b/web/src/app/chat/ChatPage.tsx index 50e19031a..3d0c21bcc 100644 --- a/web/src/app/chat/ChatPage.tsx +++ b/web/src/app/chat/ChatPage.tsx @@ -1216,6 +1216,124 @@ export function ChatPage({ stackTrace = (packet as StreamingError).stack_trace; } else if (Object.hasOwn(packet, "message_id")) { finalMessage = packet as BackendMessage; + + const newUserMessageId = finalMessage.parent_message!; + const newAssistantMessageId = finalMessage.message_id; + + if ( + newUserMessageId !== undefined && + newAssistantMessageId !== undefined + ) { + let { + messageMap: newFrozenMessageMap, + sessionId: newFrozenSessionId, + } = updateFn([ + { + messageId: regenerationRequest + ? regenerationRequest?.parentMessage?.messageId! + : initialFetchDetails.user_message_id!, + message: currMessage, + type: + previousMessage?.type || generatedAssistantId + ? "assistant" + : "user", + files: previousMessage?.files || files, + toolCall: previousMessage?.toolCall || null, + parentMessageId: + previousMessage?.parentMessageId || + parentMessage?.messageId || + null, + childrenMessageIds: [ + ...(regenerationRequest?.parentMessage + ?.childrenMessageIds || []), + initialFetchDetails.assistant_message_id!, + ], + latestChildMessageId: + initialFetchDetails.assistant_message_id, + }, + { + messageId: initialFetchDetails.assistant_message_id!, + message: error || answer, + type: error ? "error" : "assistant", + retrievalType, + query: finalMessage?.rephrased_query || query, + documents: + finalMessage?.context_docs?.top_documents || documents, + citations: finalMessage?.citations || {}, + files: finalMessage?.files || aiMessageImages || [], + toolCall: finalMessage?.tool_call || toolCall, + parentMessageId: regenerationRequest + ? regenerationRequest?.parentMessage?.messageId! + : initialFetchDetails.user_message_id, + + alternateAssistantID: alternativeAssistant?.id, + }, + ]); + + // updateFn([ + // { + // messageId: newUserMessageId, + // message: currMessage, + // type: parentId ? "assistant" : "user", + // files: files, + // toolCall: null, + // parentMessageId: parentMessage?.messageId || null, + // childrenMessageIds: [newAssistantMessageId], + // latestChildMessageId: newAssistantMessageId, + // }, + // { + // messageId: newAssistantMessageId, + // message: answer, + // type: "assistant", + // retrievalType, + // query: finalMessage.rephrased_query || query, + // documents: + // finalMessage.context_docs?.top_documents || documents, + // citations: finalMessage.citations || {}, + // files: finalMessage.files || aiMessageImages || [], + // toolCall: finalMessage.tool_call || toolCall, + // parentMessageId: newUserMessageId, + // alternateAssistantID: alternativeAssistant?.id, + // }, + // ]); + parentId = newUserMessageId; + currMessage = answer; + generatedAssistantId = newUserMessageId; + + previousMessage = { + parentMessageId: parentId, + toolCall: finalMessage.tool_call, + documents: + finalMessage.context_docs?.top_documents || documents, + type: "assistant", + }; + + updateFn = (messages: Message[]) => { + const replacementsMap = finalMessage + ? new Map([ + [messages[0].messageId, TEMP_USER_MESSAGE_ID], + [messages[1].messageId, TEMP_ASSISTANT_MESSAGE_ID], + ] as [number, number][]) + : null; + + return upsertToCompleteMessageMap({ + messages: messages, + replacementsMap: replacementsMap, + completeMessageMapOverride: newFrozenMessageMap, + chatSessionId: frozenSessionId!, + }); + }; + files = finalMessage.files; + // setCurrentMessageFsetiles(finalMessage.files) + finalMessage = null; + aiMessageImages = null; + answer = ""; + } else { + console.error( + "Invalid message_id or parent_message in finalMessage" + ); + } + finalMessage = null as BackendMessage | null; } // on initial message send, we insert a dummy system message @@ -1223,64 +1341,116 @@ export function ChatPage({ parentMessage = parentMessage || frozenMessageMap?.get(SYSTEM_MESSAGE_ID)!; // TODO bring back the functionality specific to this - const updateFn = (messages: Message[]) => { - const replacementsMap = regenerationRequest - ? new Map([ - [ - regenerationRequest?.parentMessage?.messageId, - regenerationRequest?.parentMessage?.messageId, - ], - [ - regenerationRequest?.messageId, - initialFetchDetails?.assistant_message_id, - ], - ] as [number, number][]) - : null; + // updateFn = (messages: Message[]) => { + // const replacementsMap = regenerationRequest + // ? new Map([ + // [ + // regenerationRequest?.parentMessage?.messageId, + // regenerationRequest?.parentMessage?.messageId, + // ], + // [ + // regenerationRequest?.messageId, + // initialFetchDetails?.assistant_message_id, + // ], + // ] as [number, number][]) + // : null; - return upsertToCompleteMessageMap({ - messages: messages, - replacementsMap: replacementsMap, - completeMessageMapOverride: frozenMessageMap, - chatSessionId: frozenSessionId!, - }); - }; + // return upsertToCompleteMessageMap({ + // messages: messages, + // replacementsMap: replacementsMap, + // completeMessageMapOverride: frozenMessageMap, + // chatSessionId: frozenSessionId!, + // }); + // }; + if ( + !Object.hasOwn(packet, "message_id") && + !Object.hasOwn(packet, "delimiter") + ) { + // const newUserMessageId = + // finalMessage?.parent_message || TEMP_USER_MESSAGE_ID; + // const newAssistantMessageId = + // finalMessage?.message_id || TEMP_ASSISTANT_MESSAGE_ID; - updateFn([ - { - messageId: regenerationRequest - ? regenerationRequest?.parentMessage?.messageId! - : initialFetchDetails.user_message_id!, - message: currMessage, - type: "user", - files: currentMessageFiles, - toolCall: null, - parentMessageId: error ? null : lastSuccessfulMessageId, - childrenMessageIds: [ - ...(regenerationRequest?.parentMessage?.childrenMessageIds || - []), - initialFetchDetails.assistant_message_id!, - ], - latestChildMessageId: initialFetchDetails.assistant_message_id, - }, - { - messageId: initialFetchDetails.assistant_message_id!, - message: error || answer, - type: error ? "error" : "assistant", - retrievalType, - query: finalMessage?.rephrased_query || query, - documents: - finalMessage?.context_docs?.top_documents || documents, - citations: finalMessage?.citations || {}, - files: finalMessage?.files || aiMessageImages || [], - toolCall: finalMessage?.tool_call || toolCall, - parentMessageId: regenerationRequest - ? regenerationRequest?.parentMessage?.messageId! - : initialFetchDetails.user_message_id, - alternateAssistantID: alternativeAssistant?.id, - stackTrace: stackTrace, - alternate_model: finalMessage?.alternate_model, - }, - ]); + updateFn([ + { + messageId: regenerationRequest + ? regenerationRequest?.parentMessage?.messageId! + : initialFetchDetails.user_message_id!, + message: currMessage, + type: + previousMessage?.type || generatedAssistantId + ? "assistant" + : "user", + files: previousMessage?.files || files, + toolCall: previousMessage?.toolCall || null, + parentMessageId: + previousMessage?.parentMessageId || + parentMessage?.messageId || + null, + childrenMessageIds: [ + ...(regenerationRequest?.parentMessage + ?.childrenMessageIds || []), + initialFetchDetails.assistant_message_id!, + ], + latestChildMessageId: + initialFetchDetails.assistant_message_id, + }, + { + messageId: initialFetchDetails.assistant_message_id!, + message: error || answer, + type: error ? "error" : "assistant", + retrievalType, + query: finalMessage?.rephrased_query || query, + documents: + finalMessage?.context_docs?.top_documents || documents, + citations: finalMessage?.citations || {}, + files: finalMessage?.files || aiMessageImages || [], + toolCall: finalMessage?.tool_call || toolCall, + parentMessageId: regenerationRequest + ? regenerationRequest?.parentMessage?.messageId! + : initialFetchDetails.user_message_id, + + alternateAssistantID: alternativeAssistant?.id, + }, + ]); + } + + // updateFn([ + // { + // messageId: regenerationRequest + // ? regenerationRequest?.parentMessage?.messageId! + // : initialFetchDetails.user_message_id!, + // message: currMessage, + // type: "user", + // files: currentMessageFiles, + // toolCall: null, + // parentMessageId: error ? null : lastSuccessfulMessageId, + // childrenMessageIds: [ + // ...(regenerationRequest?.parentMessage?.childrenMessageIds || + // []), + // initialFetchDetails.assistant_message_id!, + // ], + // latestChildMessageId: initialFetchDetails.assistant_message_id, + // }, + // { + // messageId: initialFetchDetails.assistant_message_id!, + // message: error || answer, + // type: error ? "error" : "assistant", + // retrievalType, + // query: finalMessage?.rephrased_query || query, + // documents: + // finalMessage?.context_docs?.top_documents || documents, + // citations: finalMessage?.citations || {}, + // files: finalMessage?.files || aiMessageImages || [], + // toolCall: finalMessage?.tool_call || toolCall, + // parentMessageId: regenerationRequest + // ? regenerationRequest?.parentMessage?.messageId! + // : initialFetchDetails.user_message_id, + // alternateAssistantID: alternativeAssistant?.id, + // stackTrace: stackTrace, + // alternate_model: finalMessage?.alternate_model, + // }, + // ]); } } }