From b60afb16cbffe55bb253eabd079e206b2c483452 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 1 Feb 2026 10:35:03 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BD=BF=E7=94=A8=20wrappedSendMessage?= =?UTF-8?q?=20=E4=BF=9D=E5=AD=98=E7=94=A8=E6=88=B7=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=88=B0=E7=8B=AC=E7=AB=8B=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 创建 wrappedSendMessage 包装函数 2. 在发送消息时同时保存用户消息到 appendedMessages 3. 这样即使 useChat 重置消息状态,用户消息也会保留在 mergedMessages 中 Co-authored-by: Cursor --- components/chat.tsx | 55 +++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/components/chat.tsx b/components/chat.tsx index a31d839d1..31564bd8f 100644 --- a/components/chat.tsx +++ b/components/chat.tsx @@ -3,7 +3,7 @@ import { useChat } from "@ai-sdk/react"; import { DefaultChatTransport } from "ai"; import { useRouter, useSearchParams } from "next/navigation"; -import { useEffect, useMemo, useRef, useState } from "react"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import useSWR, { useSWRConfig } from "swr"; import { unstable_serialize } from "swr/infinite"; import { ChatHeader } from "@/components/chat-header"; @@ -356,28 +356,8 @@ export function Chat({ // 🆕 生成完成,清除持久化状态 completeGeneration(); console.log("[Chat] onFinish called"); - - // 🆕 在流式传输完成后,将 appendedMessages 合并到 messages - // 延迟执行以确保 useChat 内部状态已稳定 - setTimeout(() => { - setAppendedMessages((prevAppended) => { - if (prevAppended.length > 0) { - console.log("[Chat] Merging appendedMessages to messages:", prevAppended.length); - setMessages((prevMessages) => { - // 过滤掉已存在的消息 - const newMessages = prevAppended.filter( - (appended) => !prevMessages.some((m) => m.id === appended.id) - ); - if (newMessages.length > 0) { - console.log("[Chat] Actually adding new messages:", newMessages.length); - return [...prevMessages, ...newMessages]; - } - return prevMessages; - }); - } - return []; // 清空 appendedMessages - }); - }, 100); + // 🆕 不再尝试在 onFinish 中合并消息,完全依赖 mergedMessages + // 消息会在下次页面加载时从数据库正确获取 }, onError: (error) => { if (error instanceof ChatSDKError) { @@ -393,6 +373,27 @@ export function Chat({ }, }); + // 🆕 包装 sendMessage,在发送时保存用户消息到 appendedMessages + // 这样即使 useChat 重置消息状态,用户消息也会保留在 mergedMessages 中 + const wrappedSendMessage = useCallback((message: Parameters[0]) => { + // 保存用户消息到 appendedMessages + const textPart = message?.parts?.find((p: any) => p.type === "text") as any; + const userMessage: ChatMessage = { + id: generateUUID(), + role: "user", + content: textPart?.text || "", + createdAt: new Date(), + parts: message?.parts || [], + attachments: (message as any)?.attachments || [], + } as ChatMessage; + + console.log("[Chat] Saving user message to appendedMessages:", userMessage.id); + setAppendedMessages((prev) => [...prev, userMessage]); + + // 调用原始的 sendMessage + return sendMessage(message); + }, [sendMessage]); + // 调试:监控聊天状态变化 & 持久化生成状态 // 使用 ref 来访问最新的 modelsData,避免依赖数组问题 const modelsDataRef = useRef(modelsData); @@ -430,7 +431,7 @@ export function Chat({ useEffect(() => { if (query && !hasAppendedQuery) { - sendMessage({ + wrappedSendMessage({ role: "user" as const, parts: [{ type: "text", text: query }], }); @@ -1113,7 +1114,7 @@ export function Chat({ isReadonly={isReadonly} messages={mergedMessages} regenerate={regenerate} - sendMessage={sendMessage} + sendMessage={wrappedSendMessage} selectedModelId={currentModelId} setMessages={setMessages} status={status} @@ -1143,7 +1144,7 @@ export function Chat({ onModelChange={setCurrentModelId} selectedModelId={currentModelId} selectedVisibilityType={visibilityType} - sendMessage={sendMessage} + sendMessage={wrappedSendMessage} setAttachments={setAttachments} setInput={setInput} setMessages={setMessages} @@ -1176,7 +1177,7 @@ export function Chat({ regenerate={regenerate} selectedModelId={currentModelId} selectedVisibilityType={visibilityType} - sendMessage={sendMessage} + sendMessage={wrappedSendMessage} setAttachments={setAttachments} setInput={setInput} setMessages={setMessages}