fix: 使用 wrappedSendMessage 保存用户消息到独立状态
1. 创建 wrappedSendMessage 包装函数 2. 在发送消息时同时保存用户消息到 appendedMessages 3. 这样即使 useChat 重置消息状态,用户消息也会保留在 mergedMessages 中 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
b3d37f815a
commit
b60afb16cb
@ -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<typeof sendMessage>[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}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user