From 9ac5008139cd75cf34afe7189c6b74efd03c3461 Mon Sep 17 00:00:00 2001 From: chanx <1243304602@qq.com> Date: Thu, 13 Aug 2026 14:17:04 +0800 Subject: [PATCH] fix(web): regenerate a single-chat answer as a new turn (#18202) --- web/src/pages/next-chats/chat-stream/store.ts | 39 ------------------- .../next-chats/hooks/use-send-chat-message.ts | 37 ++++++++++-------- 2 files changed, 20 insertions(+), 56 deletions(-) diff --git a/web/src/pages/next-chats/chat-stream/store.ts b/web/src/pages/next-chats/chat-stream/store.ts index da882722d0..0ecb403ed2 100644 --- a/web/src/pages/next-chats/chat-stream/store.ts +++ b/web/src/pages/next-chats/chat-stream/store.ts @@ -44,7 +44,6 @@ export type ChatStreamState = { failStream(conversationId: string, pendingInput: string): void; consumePendingInput(conversationId: string): void; removeMessageById(conversationId: string, messageId: string): void; - truncateAfterMessage(conversationId: string, messageId: string): void; endStream(conversationId: string): void; stopStream(conversationId: string): void; removeSessions(conversationIds: string[]): void; @@ -324,44 +323,6 @@ export const useChatStreamStore = create()( ); }, - truncateAfterMessage: (conversationId, messageId) => { - if (!conversationId) return; - set( - (state) => { - const previous = state.sessions[conversationId]; - if (!previous) return state; - - const index = previous.messages.findIndex( - (x) => x.id === messageId, - ); - if (index === -1) return state; - - const kept = previous.messages.slice(0, index + 2); - const latest = kept.at(-1); - const messages = latest - ? [ - ...kept.slice(0, -1), - { - ...latest, - content: '', - reference: undefined, - prompt: undefined, - }, - ] - : kept; - - return { - sessions: { - ...state.sessions, - [conversationId]: { ...previous, messages }, - }, - }; - }, - false, - 'truncateAfterMessage', - ); - }, - endStream: (conversationId) => { if (!conversationId) return; set( diff --git a/web/src/pages/next-chats/hooks/use-send-chat-message.ts b/web/src/pages/next-chats/hooks/use-send-chat-message.ts index cf501a2ff4..b3e8324133 100644 --- a/web/src/pages/next-chats/hooks/use-send-chat-message.ts +++ b/web/src/pages/next-chats/hooks/use-send-chat-message.ts @@ -2,11 +2,10 @@ import { NextMessageInputOnPressEnterParameter } from '@/components/message-inpu import { MessageType } from '@/constants/chat'; import { useHandleMessageInputChange, - useRegenerateMessage, useScrollToBottom, } from '@/hooks/logic-hooks'; import { useGetChatSearchParams } from '@/hooks/use-chat-request'; -import { IMessage } from '@/interfaces/database/chat'; +import { IMessage, Message } from '@/interfaces/database/chat'; import notification from '@/utils/notification'; import { trim } from 'lodash'; import { useCallback, useEffect, useRef } from 'react'; @@ -83,9 +82,6 @@ export const useSendMessage = () => { const removeMessageFromStore = useChatStreamStore( (state) => state.removeMessageById, ); - const truncateAfterMessage = useChatStreamStore( - (state) => state.truncateAfterMessage, - ); const hydrateFromServer = useChatStreamStore( (state) => state.hydrateFromServer, ); @@ -138,13 +134,6 @@ export const useSendMessage = () => { setValue(pendingInput); }, [pendingInput, value, conversationId, consumePendingInput, setValue]); - const removeMessagesAfterCurrentMessage = useCallback( - (messageId: string) => { - truncateAfterMessage(conversationId, messageId); - }, - [conversationId, truncateAfterMessage], - ); - const removeMessageById = useCallback( (messageId: string) => { removeMessageFromStore(conversationId, messageId); @@ -152,11 +141,25 @@ export const useSendMessage = () => { [conversationId, removeMessageFromStore], ); - const { regenerateMessage } = useRegenerateMessage({ - removeMessagesAfterCurrentMessage, - sendMessage, - messages, - }); + // Regenerating re-asks the same question as a new turn instead of rewriting + // the original exchange, so every earlier answer stays in the transcript. + const regenerateMessage = useCallback( + (message: Message) => { + if (isStreaming) return; + + const questionMessage: IMessage = { + content: message.content, + files: message.files, + id: uuid(), + role: MessageType.User, + conversationId, + }; + + appendQuestion(conversationId, questionMessage); + sendMessage({ message: questionMessage }); + }, + [conversationId, isStreaming, appendQuestion, sendMessage], + ); const { createConversationBeforeSendMessage } = useCreateConversationBeforeSendMessage();