diff --git a/components/canvas/CanvasChatPanel.tsx b/components/canvas/CanvasChatPanel.tsx index 553aac771..a5d30fd18 100644 --- a/components/canvas/CanvasChatPanel.tsx +++ b/components/canvas/CanvasChatPanel.tsx @@ -587,6 +587,7 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF const [activeChatId, setActiveChatId] = useState(chatId); const [chatSessions, setChatSessions] = useState([]); const [isSessionMenuOpen, setIsSessionMenuOpen] = useState(false); + const [messageViewportKey, setMessageViewportKey] = useState(0); const messagesEndRef = useRef(null); const fileInputRef = useRef(null); const videoSlotInputRefs = useRef>([]); @@ -1617,6 +1618,7 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF loadedHistorySignatureRef.current = signature; setMessages(historyMessages); + setMessageViewportKey((prev) => prev + 1); console.log("[CanvasChat] 已同步历史消息:", historyMessages.length, signature); requestAnimationFrame(() => { @@ -1646,6 +1648,7 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF hiddenPromptRef.current = null; autoContextRef.current = null; pendingLaunchRef.current = null; + setMessageViewportKey((prev) => prev + 1); setMessages([]); setInput(""); setAttachments([]); @@ -3139,14 +3142,15 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF
) : ( -
+
{!isDetailGenerationMode && visibleMessages.length === 0 && (
{/* Greeting */} @@ -3260,7 +3264,7 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF
@@ -3285,8 +3289,10 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF {/* 消息气泡 */}
{message.role === 'user' ? ( // 🆕 用户消息:使用图片标签样式(类似竞品,按 parts 原始顺序渲染) @@ -3372,14 +3378,14 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF // AI 消息:保持原样式
{/* 消息内容 */} -
+
{cleanedMessage.parts?.map((part: any, i: number) => { if (part.type === 'text') { // 提取并显示图片