diff --git a/components/messages.tsx b/components/messages.tsx index d577ae8..4d8a0ca 100644 --- a/components/messages.tsx +++ b/components/messages.tsx @@ -147,6 +147,12 @@ function PureMessages({ imageGenerationPhase === "queued" || imageGenerationPhase === "processing" || imageGenerationPhase === "finalizing"; + const stripInternalMarkers = (text: string) => + text + .replace(/\n*\n*/g, "") + .replace(/\n*\n*/g, "") + .replace(/\n*\n*/g, "") + .trim(); useEffect(() => { return () => { @@ -288,11 +294,16 @@ function PureMessages({ // - 收到 AI 文字回复后 3 秒: true(开始显示生图占位图) // - 收到图片消息: false(隐藏占位图) - // 检查最后一条消息是否是 AI 的文字回复(包含 GENERATING_IMAGE 标记) - const hasAssistantTextReply = messages.some(msg => - msg.role === "assistant" && msg.parts?.some( - (part: any) => part.type === "text" && part.text?.includes("") - ) + // 检查当前轮次是否已收到 AI 文字回复(只看最后一条用户消息之后) + const lastUserIndex = messages.findLastIndex((m) => m.role === "user"); + const assistantMessagesAfterUser = lastUserIndex >= 0 + ? messages.slice(lastUserIndex + 1).filter((m) => m.role === "assistant") + : messages.filter((m) => m.role === "assistant"); + const hasAssistantTextReply = assistantMessagesAfterUser.some((msg) => + msg.parts?.some((part: any) => { + if (part.type !== "text" || !part.text) return false; + return stripInternalMarkers(part.text).length > 0; + }) ); if (hasImageContent) { @@ -353,22 +364,19 @@ function PureMessages({ const isAutoModeWithImage = selectedModelId === "auto" && lastUserMessage?.parts?.some((p: any) => p.type === "file" || p.type === "image"); - const hasAssistantTextReplyWithContent = messages.some(msg => - msg.role === "assistant" && msg.parts?.some((part: any) => { + const lastUserIndex = messages.findLastIndex((m) => m.role === "user"); + const assistantMessagesAfterUser = lastUserIndex >= 0 + ? messages.slice(lastUserIndex + 1).filter((m) => m.role === "assistant") + : messages.filter((m) => m.role === "assistant"); + const hasAssistantTextReplyWithContent = assistantMessagesAfterUser.some((msg) => + msg.parts?.some((part: any) => { if (part.type !== "text" || !part.text) return false; - const cleanedText = part.text - .replace(/\n*\n*/g, "") - .replace(/\n*\n*/g, "") - .replace(/\n*\n*/g, "") - .trim(); - return cleanedText.length > 0; + return stripInternalMarkers(part.text).length > 0; }) ); let hasImageContent = false; if (isAutoModeWithImage) { - const lastUserIndex = messages.findLastIndex(m => m.role === "user"); - const assistantMessagesAfterUser = messages.slice(lastUserIndex + 1).filter(m => m.role === "assistant"); hasImageContent = assistantMessagesAfterUser.some(msg => msg.parts?.some((part: any) => part.type === "text" && part.text && ( part.text.includes("![thumb|") || @@ -587,19 +595,24 @@ function PureMessages({ (part: any) => part.type === "text" && part.text?.includes("") ) ); - const hasAssistantTextReplyWithContent = messages.some(msg => - msg.role === "assistant" && msg.parts?.some((part: any) => { + const assistantMessagesAfterUser = lastUserIndexForMarkers >= 0 + ? messages.slice(lastUserIndexForMarkers + 1).filter((msg) => msg.role === "assistant") + : messages.filter((msg) => msg.role === "assistant"); + const hasAssistantTextReplyWithContent = assistantMessagesAfterUser.some((msg) => + msg.parts?.some((part: any) => { if (part.type !== "text" || !part.text) return false; - const cleanedText = part.text - .replace(/\n*\n*/g, "") - .replace(/\n*\n*/g, "") - .replace(/\n*\n*/g, "") - .trim(); - return cleanedText.length > 0; + return stripInternalMarkers(part.text).length > 0; }) ); + const shouldWaitForAgentReplyBeforeImagePlaceholder = + userMessageHasImage && + (isAutoMode || showGemini || showVolcano || showAlibabaImage) && + !hasAssistantTextReplyWithContent; if (showVideo) return ; + if (shouldWaitForAgentReplyBeforeImagePlaceholder) { + return ; + } if (showGemini) return ; if (showVolcano) return ; if (showAlibabaImage) {